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)
Это работает для меня.