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

Posted

技术标签:

【中文标题】SQL Server 2014 中类似于 DATEDIFF_BIG 的自定义代码【英文标题】:Custom code similar to DATEDIFF_BIG in SQL Server 2014 【发布时间】:2019-01-17 05:09:06 【问题描述】:

我正在使用 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

【问题讨论】:

您能否分享一个与问题有关的数据示例? @Jaime 这是一个例子: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 如果以秒为单位的差异导致溢出,也许您需要使用分钟来获得更小的数字 @marc_s 但我需要与第二个进行比较。 【参考方案1】:

根据您的代码,

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

【讨论】:

而不是LEAD(A.CreatedDate,1,0) 使用convert ( datetime, LEAD (A.CreatedDate,1,A.CreatedDate).. 并删除case when ... then .. else ... end

以上是关于SQL Server 2014 中类似于 DATEDIFF_BIG 的自定义代码的主要内容,如果未能解决你的问题,请参考以下文章

sql server 中取出今年和去年每个月的数据

查找在 SQL Server 2014 中拥有多个帐户的客户的真正开始结束日期

Sql server中有没有replace语句? 没有的话,怎样实现类似于mySql中的repla

如何在 MySQL 中打破类似于 MS SQL Server 的列名?

在SQL Server和Postgresql中使用CASE作为类似于枢轴的函数

类似 phpMyAdmin 但适用于 SQL Server 的东西? [关闭]