SQL Server: функция yesiff привела к переполнению при использовании MILLISECOND

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

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

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

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

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

Проблема в том, что мне действительно нужны МИЛЛИКОНДЫ.

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

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)

Ответ 4

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

объявить @timetagInMillsecond bigint = CAST (CAST (cast (@timetag as datetime) -'1970-01-01 'AS decimal (38,10)) * 24 * 60 * 60 * 1000 + 0,5 as BIGINT)

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