2010-04-27 2 views
3

Мне нужно сохранить некоторые интервалы в mssql db. Я знаю, что точность datetime составляет ок. 3,3 мс (может заканчиваться только 0, 3 и 7). Но когда я вычисляю интервалы между датами, я вижу, что результат может заканчиваться только 0, 3 и 6. Таким образом, чем больше интервалов я суммирую, тем больше теряется точность. Можно ли получить точный DATEDIFF в миллисекундах?SQL Server 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),@[email protected], @StartDate, @EndDate 

Я хотел бы видеть 7 объявлений не 6. (И это должно быть как можно быстрее)

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

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

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

Я до сих пор удивляюсь, почему DATEDIFF(millisecond, @StartDate, @EndDate) неточна?

+0

Какую версию MSSQL вы используете? Возможно ли обновление до 2008 года? –

+0

MSSQL2005, к сожалению нет. – jomi

ответ

2

Как насчет расчета разницы 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

Благодарим вас и других за помощь. – jomi

0

Что об использовании 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, @[email protected]), 
     @StartDate, @EndDate 
+0

@ EndDate- @ StartDate может заканчиваться только 0, 3 и 7, поэтому он не будет работать, если: set @ StartDate = '2010-04-01 12: 00: 00.003' set @ EndDate = '2010-04- 01 12: 00: 00.007 ' – jomi

0

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

SELECT DATEDIFF(millisecond, @StartDate, dateadd(day,1,@EndDate)),dateadd(day,1,@EndDate)[email protected], @StartDate, @EndDate 
0

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

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

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

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

+0

Они не обязательно непрерывны, но если они есть, и я суммирую 5 секундных интервалов в час, я вижу, что пара 100 мс отсутствует.Хранение интервалов и дат начала может быть правильным решением, но мне все же интересно, если это ограничение датирования или я что-то пропустил. Благодарю. – jomi

0

Или вы можете использовать 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 vs DateTime in SQL Server

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