与SQL Server 2014中的DATEDIFF_BIG相似的自定义代码

时间:2019-01-17 05:09:06

标签: sql sql-server sql-server-2014

我正在使用SQL Server2014。当我想将前一行日期时间与当前第二秒进行比较时,我遇到了一个问题。错误状态:

  

datediff函数导致溢出。日期部分的数量   分隔两个日期/时间实例太大。尝试使用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 :(得分:3)

根据您的代码,

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函数从当前行读取LEAD / Next行,但在最后一条记录中,LEAD函数未找到任何行,因此它返回datetime默认日期。在这种情况下,您需要与默认日期进行比较。

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

另一种方式, 代替LEAD(A.CreatedDate,1,0),请使用LEAD(A.CreatedDate,1,A.CreatedDate)。
因此,最佳解决方案是...

 preData = [
    ['APP_NOT_RUNNING', 0],
    ['FALLBACK', 0],
    ['IDLE', 0],
    ['OUTOFSERVICE', 0]
];