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