【问题标题】:SQL Server Date Diff On Rows In Table表中行上的 SQL Server Datediff
【发布时间】: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 用于开始和停止。

标签: sql sql-server tsql sql-server-2008-r2


【解决方案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
猜你喜欢
  • 2021-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多