sql - SQL Server 2014 中类似于 DATEDIFF_BIG 的自定义代码

标签 sql sql-server sql-server-2014

我正在使用 SQL Server 2014。当我想以秒为单位比较前一行日期时间与当前行时,我遇到了问题。错误指出:

The datediff function resulted in an overflow. The number of dateparts separating two date/time instances is too large. Try to use datediff with a less precise datepart.



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

最佳答案

根据你的代码,

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

LEAD函数提供对当前行之后但在最后一行的给定物理偏移处的行的访问 LEAD函数未找到任何后续行,因此返回默认日期时间 '1900-01-01 00:00:00'.对于这种情况,您需要与默认日期时间进行比较,如下所示....
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,A.CreatedDate)而不是 LEAD(A.CreatedDate,1,0) ,您不需要使用任何 case陈述和解决方案将是最佳的,如下所示......
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

关于sql - SQL Server 2014 中类似于 DATEDIFF_BIG 的自定义代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54229375/

相关文章:

sql - 运行 SQL 查询 - 超时

c# - 无法使用 EF 交换两行上的唯一值

sql-server - EF4发出的奇怪的SQL语句

SQL Server - 如何从从上到下的数字列表中查询最大数字集

python - 用于百分比计算的查询参数存在语法错误

sql - 如何在 SQL 中添加序列/排序数据

mysql - 如何使用 phpMyAdmin 和外键制作音乐库?

c# - 从数据库中提取数据时,如何在 GridView 中仅显示日期? C#

mysql - 在 mysql 中使用 CAST 进行不正确的排序

mysql - 在mysql中使用表达式获取最后插入的ID