2015-08-27 2 views
0

я хочу, чтобы вычислить разницу во времени между двумя временами, но моя проблема, может быть, второй раз будет после полуночи, и первый перед ним нравится:SQL DATEDIFF из утра вечера

time 1 = '2015-08-02 09:30 PM' 
time 2 = '2015-08-03 02:30 AM' 

так что в этом случае разница между ними будет отрицательным, я пытаюсь умножить значение, возвращенное -1, чтобы преобразовать его в положительное значение, но и другие данные будут неправильно ..

мой код:

DECLARE @StartDate datetime = '2015-08-02'; 
DECLARE @EndDate datetime = '2015-08-02'; 
DECLARE @EmpID nvarchar(6) = '12345'; 

SELECT 
SUM(CASE WHEN(DATEDIFF(minute, a.[Time], @StartDate)) < 0 
then DATEDIFF(minute, a.[Time], @StartDate) * -1 
ELSE DATEDIFF(minute, a.[Time], @StartDate) END 
) 

FROM 
Attendance a 
WHERE 
(EmpID = @EmpID OR @EmpID IS NULL) 
AND a.[date] <= @EndDate 
GROUP BY EmpID 

так как я могу это решить?

+0

Не должен ли 'END' быть после' ELSE' в вашем 'CASE' заявлении? Это опечатка или ваш код такой? – Raj

+0

yes Raj, я исправил его. –

+0

Возможно, попробуйте преобразовать данные в формат 24 с помощью 'Convert (datetime, '2015-08-02 09:30 PM')' например. –

ответ

0

Я думаю, что следующее:

CASE WHEN a.[Time] > @StartDate 
THEN DATEDIFF(minute,@StartDate,a.[Time]) 
ELSE DATEDIFF(minute,a.[Time],@StartDate) 
END 

Если это сделать, и всегда будет давать положительное значение.

select datediff(minute, '2015-08-02 09:30 PM' ,'2015-08-03 02:30 AM') 

Возвращает 300, который является правильным (5 часов, 5 * 60 = 300)

1

Я не вижу ничего плохого в вашем коде. Но я бы использовал этот синтаксис вместо этого:

SUM(ABS(DATEDIFF(minute, a.[Time], @StartDate)))