表中行上的 SQL Server Datediff

Posted

技术标签:

【中文标题】表中行上的 SQL Server Datediff【英文标题】:SQL Server Date Diff On Rows In Table 【发布时间】:2018-09-27 20:13:22 【问题描述】:

我有一个查询,它在不同的行上分组开始和停止时间,其中批次编号 1 是开始时间,批次编号 2 是停止时间,我需要对它们进行日期差异。我尝试添加行号并尝试执行日期差异行 1 和 2、3 和 4 等操作,但没有成功。

所以我必须在 1 和 3、2 和 4 上进行日期差异,以此类推,只要批次 1 和 2 在一起。

这是我的数据的样子:

RowNumber  OrderNumber  IDCode    DateVal              MilestoneID   BatchNumber
-------------------------------------------------------------------
1          5017555.1    4077213   2018-08-30 12:22:51.253  15           1
3          5017555.1    4081502   2018-09-05 12:41:08.817  16           2
2          5017555.1    4095474   2018-09-18 10:42:47.457  15           1
4          5017555.1    4095665   2018-09-18 12:07:11.083  16           2

【问题讨论】:

这些 RowNumber 值是否正确? 开始和停止时间在哪里?我看不到任何看起来像日期或时间数据类型的东西。 那么您已经有一个计算这些批号的查询? 开始时间为第1行第1批,值在DateVal中,停止时间为第3行第2批DateVal。 抱歉,我的副本格式都搞砸了,所以我将其编辑为正确的日期时间值。我确实有一个查询将开始和结束时间拉出来并将它们分组为 1 和 2 用于开始和停止。 【参考方案1】:

LAG 允许您从前一行获取值:

Select * 
datediff (day, LAG(DateVal) OVER (ORDER BY OrderNumber) ,DateVal ) 
From YourTable

您还可以使用Lead 从下一行获取值

【讨论】:

还想添加一个PARTITION BY BatchNumber LAG 对我不起作用,我正在使用 SQL Server Management Studio。 SELECT A.OrderNumber, A.BatchNumber, A.DateVal, datediff (day, LAG(A.DateVal) OVER (ORDER BY A.OrderNumber) ,A.DateVal ) From #HoldTimes A跨度> 说 LAG 不是 SSMS 中可识别的内置函数名称。 检查您的 COMPATIBILITY_LEVEL。如果可能,至少将其设置为 110: ALTER DATABASE DBName SET COMPATIBILITY_LEVEL = 110

以上是关于表中行上的 SQL Server Datediff的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server DATEDIFF() 函数

SQL SERVER DATEDIFF()函数用法

sql 怎样获取 时间段

SQL Server 日期的加减函数: DATEDIFF DATEADD

SQL sever 2008 如何根据一个表中的两个时间计算出时间差

将 DATEDIFF 从 SQL Server 转换为 redshift