代码之家  ›  专栏  ›  技术社区  ›  Majedur

类似于SQL Server 2014中datediff_big的自定义代码

  •  8
  • Majedur  · 技术社区  · 7 年前

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

    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 回复  |  直到 7 年前
        1
  •  3
  •   Osman Aditya    7 年前

    根据你的密码,

    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
    
    推荐文章