SQL Server: функция datediff привела к переполнению при использовании миллисекунды

у меня есть следующий запрос :

select CONVERT(varchar(12), DATEADD(MILLISECOND, DateDiff(MILLISECOND, '2014-08-04 10:37:28.713','2014-11-04 08:21:17.723'), 0), 114)

когда я выполняю это, я получаю ошибку : "Функция datediff привела к переполнению. Количество частей данных, разделяющих два экземпляра даты / времени, слишком велико. Попробуйте использовать datediff с менее точным datepart."

когда я меняю запрос на следующий, он отлично работает:

select CONVERT(varchar(12), DATEADD(SECOND, DateDiff(SECOND, '2014-08-04 10:37:28.713','2014-11-04 08:21:17.723'), 0), 114)

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

4 ответов


для МС, максимальная разница между StartDate и enddate-24 дней, 20 часов, 31 минут и 23,647 секунд. см.http://msdn.microsoft.com/en-us/library/ms189794.aspx

Если вам нужна миллисекунда выше этого уровня, вам нужно написать что-то пользовательское.


немного позже ответ, но может помочь. В SQL 2016 MS введена функция DATEDIFF_BIG, которая будет (в соответствии с размером типа) переполняться в разнице больше, чем что-то вроде 290k лет. Но статья technet имеет ту же разницу во времени, что и базовая DATEDIFF -https://msdn.microsoft.com/en-us/library/mt628058.aspx


вам не нужно ссылаться на миллисекунды в вашем расчете.

Это будет делать то же самое, что и ваш скрипт, за исключением переполнения:

SELECT CONVERT(varchar(12), 
        CAST('2014-11-04 08:21:17.723' as datetime) - 
        CAST('2014-08-04 10:37:28.713' as datetime)
       , 114)

для меня был большой интервал между двумя датами, поэтому я использовал ниже код

объявить @timetagInMillsecond bigint=CAST (CAST (литой (@timetag как datetime) - '1970-01-01' в десятичном формате(38,10))*24*60*60*1000+0.5 как тип bigint)

Это работает для меня .