sql查询计算不同列和相邻行的两个日期之间的差异

Posted

技术标签:

【中文标题】sql查询计算不同列和相邻行的两个日期之间的差异【英文标题】:sql query to calculate the difference between two dates of different columns and adjacent rows 【发布时间】:2016-06-03 08:20:53 【问题描述】:

下面是我的桌子。

我想通过计算两个日期之间的差异来填充中断列

我想计算列 EndD、EndT 和 StartD、StartD 之间但不同行(第 2 行)的时间。 例如- EndD 为“2016-06-01 18:17:48”,开始日期为“2016-06-01 18:46:05”,休息时间应在这两个日期之间计算

输出应该是这样的:

【问题讨论】:

您使用的是哪个 DBMS? 并请显示表结构(或至少 startD 和 StartT 数据类型) sql server 2008 and table structure if you ask..m using nvarchar(50) for StartD, StartT, EndD,EndT and for Break Time(0) 【参考方案1】:

试试这个:

SELECT  ID, AgentID, StartD, StartT, EndD, EndT,
      DATEDIFF(minute, 
         CAST(t1.EndD + ' ' + t1.EndT AS DATETIME),
         (SELECT CAST(t2.StartD + ' ' + t2.StartT AS DATETIME)
            FROM yourTable t2 
            WHERE t2.ID = t1.ID + 1  AND t1.AgentID = t2.AgentID)) as [break] 
FROM  yourTable t1

Datediff 函数获取嵌入式查询(从具有相同代理的下一行获取日期和时间)与当前行的日期和时间之间的分钟数。此外,请务必在列名“break”周围使用方括号,因为它是 SQL-Server 保留字。

更新:

用户从我的回答中报告了负值。这应该通过在DATEDIFF 函数中切换两个日期参数来解决。我已经更新了代码(上面)以反映这一点。

【讨论】:

谢谢达斯汀。:) 但我得到的 Breakvalues 为负数。 您应该能够在 DATEDIFF 函数中切换两个日期参数来解决这个问题(并获得正值)。我刚刚编辑了我的答案以显示这一点 是的......即使我也在尝试做这样的事情......非常感谢达斯汀:)【参考方案2】:

对于可以工作的 tsql

update a 
set a.break=datediff(minute,a.endt,b.startt)
from tbl a
inner join tbl b 
on a.startD=b.endD and a.ID=b.ID-1 

【讨论】:

我使用的是 sql server 2008 我可以用 cte 这个吗 那么使用上述查询有什么问题【参考方案3】:
SELECT 
DATEDIFF(minute,'2016-06-01 20:17:48','2016-06-01 20:50:17')

提到你应该按照你想要的顺序改变它,并且总是增加 startT + 1

【讨论】:

我的朋友没有硬编码。函数 Datediff 准确地返回你想要的,这就是她的工作。因此,如果您将其作为第一个参数 startT(下一个)和第二个参数 EndT,那么它将完美地工作

以上是关于sql查询计算不同列和相邻行的两个日期之间的差异的主要内容,如果未能解决你的问题,请参考以下文章

Sql查询以查找两个给定日期之间的视图百分比差异

在mysql查询中使用php time()函数计算两个日期之间的差异

如何计算两个日期之间的差异

在 Db2 中如何计算相邻行的差异

如何获得 s-s-rS 中两个日期变量之间的差异

计算 Oracle SQL 中 2 个日期/时间之间的差异