Точность DATEDIFF в SQL Server - PullRequest
       46

Точность DATEDIFF в SQL Server

3 голосов
/ 27 апреля 2010

Я должен хранить некоторые интервалы в mssql db. Я знаю, что точность даты и времени составляет ок. 3,3 мс (может заканчиваться только 0, 3 и 7). Но когда я вычисляю интервалы между датами, я вижу, что результат может заканчиваться только 0, 3 и 6. Так что чем больше интервалов я суммирую, тем большую точность я теряю. Можно ли получить точный DATEDIFF в миллисекундах?

declare @StartDate datetime
declare @EndDate datetime

set @StartDate='2010-04-01 12:00:00.000'
set @EndDate='2010-04-01 12:00:00.007'

SELECT DATEDIFF(millisecond, @StartDate, @EndDate),@EndDate-@StartDate, @StartDate, @EndDate

Хотелось бы увидеть 7, а не 6. (И это должно быть как можно быстрее)

** Обновление **

Я вижу значения DATEDIFF, заканчивающиеся не только 0, 3, 6, но и 4, 7 (могут быть и другие), но дело в том, что они все еще неточны. Решение, предложенное Алексом, работает. То же самое может быть достигнуто, если вы не хотите помнить правильный формат даты и времени с:

SELECT DATEDIFF(SECOND, @StartDate, @EndDate)*1000 + DATEPART(MILLISECOND , @EndDate) - DATEPART(MILLISECOND , @StartDate)

Мне все еще интересно, почему DATEDIFF(millisecond, @StartDate, @EndDate) неточен?

Ответы [ 5 ]

2 голосов
/ 27 апреля 2010

Как насчет вычисления разности MS (которая является точной, когда вы вычитаете DATEPART с), а затем добавить ее к разности DATEDIFF, исключая MS?

SELECT DATEDIFF(MILLISECOND, CONVERT(VARCHAR, @StartDate, 120), CONVERT(VARCHAR, @EndDate, 120)) + DATEPART(MILLISECOND , @endDate) - DATEPART(MILLISECOND , @StartDate)

Дает 4 для .003 ->. 007 и 7 для .000 ->. 007

0 голосов
/ 13 мая 2014

Или вы можете использовать тип даты DATETIME2 с большей точностью:

declare @StartDate datetime2
declare @EndDate datetime2

set @StartDate='2010-04-01 12:00:00.000'
set @EndDate='2010-04-01 12:00:00.007'

SELECT DATEDIFF(millisecond, @StartDate, @EndDate)

В качестве результата выбирается 7.

Посмотрите на DateTime2 против DateTime в SQL Server

0 голосов
/ 27 апреля 2010

Попробуйте вот так

   SELECT DATEDIFF(millisecond, @StartDate, dateadd(day,1,@EndDate)),dateadd(day,1,@EndDate)-@StartDate, @StartDate, @EndDate
0 голосов
/ 27 апреля 2010

Думаю, проблема в том, что ваши требования к точности слишком велики для типа данных datetime.

Если округление до 6 или 7 миллисекунд является проблемой, вы никогда не получите нужную точность.

Являются ли интервалы у вас непрерывными? Если да, то можете ли вы просто сохранить одну дату, а затем рассчитать миллисекунды между первой датой начала и последней датой окончания?

В качестве альтернативы, вы можете получить интервал, используя ваш клиентский язык? Затем сохраните интервалы как int / long? Возможно, вы могли бы сохранить начальную дату и интервал в миллисекундах, рассчитанные в коде, а не сохранять начальную и конечную даты в sql.

0 голосов
/ 27 апреля 2010

Как насчет использования DatePart

declare @StartDate datetime
declare @EndDate datetime

set @StartDate='2010-04-01 12:00:00.000'
set @EndDate='2010-04-01 12:00:00.007'

SELECT DATEDIFF(millisecond, @StartDate, @EndDate),
        DatePart(millisecond, @EndDate-@StartDate),
        @StartDate, @EndDate
...