Пользовательский код, похожий на DATEDIFF_BIG в SQL Server 2014 - PullRequest
0 голосов
/ 17 января 2019

Я использую SQL Server 2014. Я сталкиваюсь с проблемой, когда хочу сравнить дату и время предыдущей строки с текущей строкой в ​​секунду. Ошибка гласит:

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

SQL Server 2016 решил эту проблему с помощью DATEDIFF_BIG, но эта функция не поддерживается в SQL Server 2014. И в настоящее время нет планов замены сервера базы данных с SQL Server 2016.

Любое альтернативное решение будет оценено.

SELECT ROW_NUMBER() OVER (Order by A.MDetailID) as Row
  , DATEDIFF(SECOND, A.CreatedDate, LEAD(A.CreatedDate,1,0) OVER (ORDER BY A.CreatedDate))
FROM dbo.tbl_VehicleLiveMovementDetail A

1 Ответ

0 голосов
/ 17 января 2019

Согласно вашему коду,

LEAD(A.CreatedDate,1,0) OVER (ORDER BY A.CreatedDate)

Функция LEAD считывает строку LEAD / Next из текущей строки, но при последней записи функция LEAD не нашла ни одной строки, поэтому она возвращает дату и время по умолчанию. Для этого случая вам нужно сравнить с датой по умолчанию.

case when LEAD(A.CreatedDate,1,0) OVER (ORDER BY A.CreatedDate)='1900-01-01 00:00:00' then A.CreatedDate else LEAD(A.CreatedDate,1,0) OVER (ORDER BY A.CreatedDate) end

Другой способ, Вместо LEAD (A.CreatedDate, 1,0) используйте LEAD (A.CreatedDate, 1, A.CreatedDate).
Итак, оптимальным решением будет ...

SELECT 
ROW_NUMBER() OVER (Order by A.MDetailID) as Row,
DATEDIFF(SECOND, A.CreatedDate, LEAD (A.CreatedDate,1,A.CreatedDate)OVER (ORDER BY A.CreatedDate))Result
FROM dbo.tbl_VehicleLiveMovementDetail A
...