表中行上的 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 DATEADD