2013-10-15 2 views
2

Это мой код, и результат 1, но оно должно быть 0, потому что продолжительность не целую минутуDATEDIFF Неверные результаты

DECLARE @Start AS DATETIME = '2013-10-08 09:12:59.000' 
DECLARE @End AS DATETIME = '2013-10-08 09:13:09.000' 

SELECT DATEDIFF(MI,@Start, @End) 

Как я могу обойти эту проблему? Я использую SQL Server 2008 R2.

Update

Он отлично работает с секундами ..... только не минуты.

DECLARE @Start AS DATETIME = '2013-10-08 09:12:59.000' 
DECLARE @End AS DATETIME = '2013-10-08 09:13:09.000' 

SELECT DATEDIFF(SS,@Start, @End) 
+2

['DATEDIFF'] (http://technet.microsoft.com/en-us/library/ms189794.aspx):« Возвращает счетчик (целое число со знаком) указанного datepart ** границы пересекаются ** между указанным начальным и конечным ». (Мой акцент) Между вашей стартовой и конечной датой вы пересекаете минутную границу с 09:12 до 09:13. –

ответ

2

Попробуйте это

DECLARE @Start AS DATETIME = '2013-10-08 09:12:59.000' 
DECLARE @End AS DATETIME = '2013-10-08 09:13:09.000' 

SELECT DATEDIFF(SS,@Start, @End)/60 
+1

'2013-10-08 09: 12: 59.997' и' 2013-10-08 09: 13: 59.000' все еще не полная минута, и это возвращает '1'. –

+0

@MartinSmith Я согласен с вами. Кроме того, это решение также вызовет ошибку переполнения, если начало - 1900, а конец - сегодня. –

+0

@MartinSmith: Не знаете, почему вы сказали или изменили его, но, как сейчас, [это не возвращает 1] (http://sqlfiddle.com/#!3/d41d8/22747) – Kaf

3

DATEDIFOT очень прост, и если вы сравните минуты, это не займет секунд.

Измените свой запрос, чтобы получить разницу в секундах, и разделите его на 60, округляя вниз.

+1

Странно, секунды занимают минуты. – Etienne

2

9:12 до 9:13 = 1 минута

если вы хотите более высокое разрешение, использование секунд (SS) для вашего DATEPART затем разделить на 60

2

As @MartinSmith отметил, что текущие решения не обрабатывают миллисекунды, вот более точный метод

declare @t table(date1 datetime, date2 datetime) 
insert @t values('2013-10-08 09:12:00', '2013-10-08 09:13:59') 
insert @t values('2013-10-08 09:12:30', '2013-10-08 09:13:29') 
insert @t values('2013-10-08 09:12:30:111', '2013-10-08 09:13') 
insert @t values('2013-10-08 09:12:30:111', '2013-10-08 09:13') 
insert @t values('2013-10-08 09:12:30', '2013-10-08 09:12') 

select case when date2 > date1 
     then datediff(minute, 0, date2-date1) 
     else -datediff(minute, 0, date1 - date2) 
     end 
from @t 
+0

Я думаю, что ваш правильный. + 1. – Kaf

0

Чтобы быть более точным вы можете использовать:

DECLARE @Start AS DATETIME = '2013-10-08 09:12:59.997' 
DECLARE @End AS DATETIME = '2013-10-08 09:13:59.000' 

SELECT DATEDIFF(MS,@Start, @End)/60000.00 

Но вы должны знать, что разница между '2013-10-08 09: 12: 59.001' и «2013-10-08 09: 13: 59,000 'будет в этом случае также 1.

+0

попробуйте START = '2013-10-08', END = '2013-11-08'. Результат будет переполнен –

Смежные вопросы