Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 DateDiff округляет в бОльшую сторону. Как избежать?  [new]
Роман Шевченко
Member

Откуда:
Сообщений: 97
Здравствуйте.

Имею вот такой код:
SELECT     MIN(StartScan) AS Frst, MAX(StartScan) AS Lst, ResourceID, DATEDIFF(SS,MIN(StartScan), MAX(StartScan))AS S, DATEDIFF(N,MIN(StartScan), MAX(StartScan))AS M, DATEDIFF(HH,MIN(StartScan), MAX(StartScan))AS H,
((DATEDIFF(N,MIN(StartScan), MAX(StartScan)))-(DATEDIFF(HH,MIN(StartScan), MAX(StartScan))*60))AS RASMIN
FROM         RightTimeLog
WHERE     (StartScan BETWEEN CONVERT(DATETIME, '2011-11-28 00:00:00', 102) AND CONVERT(DATETIME, '2011-11-28 23:59:59', 102))
GROUP BY ResourceID

Имею вот такой результат:

2011-11-28 08:10:04.000 2011-11-28 14:13:47.000 261 21823 363 6 3
2011-11-28 08:10:50.000 2011-11-28 17:34:21.000 284 33811 564 9 24
2011-11-28 09:36:50.000 2011-11-28 17:52:36.000 264 29746 496 8 16
2011-11-28 08:30:18.000 2011-11-28 17:38:18.000 272 32880 548 9 8
2011-11-28 08:13:20.000 2011-11-28 14:13:52.000 285 21632 360 6 0
2011-11-28 08:16:48.000 2011-11-28 17:31:24.000 268 33276 555 9 15
2011-11-28 07:56:14.000 2011-11-28 17:34:18.000 263 34684 578 10 -22

Обращаем внимание на последнюю строку.
Функция DateDiff вычислила 10 часов, а не 9 часов и 38 минут...

Как подобного избежать?
Ибо нужно вычислить реально сколько часов, минут, секунд между указанными датами.

Спасибо.
29 ноя 11, 16:57    [11679113]     Ответить | Цитировать Сообщить модератору
 Re: DateDiff округляет в бОльшую сторону. Как избежать?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Роман Шевченко,

вычисляйте количество секунд и с помощью простой целочисленной арифметики получайте искомые часы/минуты/секунды.
29 ноя 11, 17:01    [11679135]     Ответить | Цитировать Сообщить модератору
 Re: DateDiff округляет в бОльшую сторону. Как избежать?  [new]
Роман Шевченко
Member

Откуда:
Сообщений: 97
Видимо, так и придется
29 ноя 11, 17:02    [11679141]     Ответить | Цитировать Сообщить модератору
 Re: DateDiff округляет в бОльшую сторону. Как избежать?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Вот, к примеру: 4203442
29 ноя 11, 17:05    [11679154]     Ответить | Цитировать Сообщить модератору
 Re: DateDiff округляет в бОльшую сторону. Как избежать?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iap
Вот, к примеру: 4203442
Таких тем здесь уйма.
Достаточно воспользоваться поиском
29 ноя 11, 17:06    [11679159]     Ответить | Цитировать Сообщить модератору
 Re: DateDiff округляет в бОльшую сторону. Как избежать?  [new]
gds
Member

Откуда: Железнодорожный
Сообщений: 1842
Блог
Роман Шевченко,

Вы пытаетесь найти разницу по времени?
29 ноя 11, 17:07    [11679169]     Ответить | Цитировать Сообщить модератору
 Re: DateDiff округляет в бОльшую сторону. Как избежать?  [new]
gds
Member

Откуда: Железнодорожный
Сообщений: 1842
Блог
Роман Шевченко,

create function dbo.uf_getTime (
	@date_start datetime,
	@date_end datetime
)
 returns varchar(16)
as 

begin
declare @res varchar(16)

select @res =	replace(str(datediff(dd, '19000101', diff),7),' ','')	+':'+
				replace(str(datepart(hh, diff),2),' ','0') +':'+ 
				replace(str(datepart(mi, diff),2),' ','0') +':'+
				replace(str(datepart(ss, diff),2),' ','0') 	
from (select @date_end - @date_start [diff]) t
return @res
end
GO

-- юзать так
select dbo.uf_getTime(min(StartScan),max(StartScan)) from kernel.RightTimeLog
29 ноя 11, 17:11    [11679197]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить