【问题标题】:SQL Query including time calculation包括时间计算的 SQL 查询
【发布时间】:2009-10-26 22:06:04
【问题描述】:

在这里进行了很好的搜索,但没有看到任何让我想到这个的东西。

基本上我有一个名为 Diaries 的表,其中包含诸如 StartTime EndTime 之类的字段,我需要进行计算以计算 StartTime 和 EndTime 之间的分钟差。然后对于适合当天的每一行,我需要在几分钟内将结果相加。

类似:

Select DiaryID, TotalMinutes 
from (Select (EndTime - StartTime) / 60 AS SubTotalMins 
      from Diary Where ID = Diary.ID) AS FirstSelect 
     (Sum(FirstSelect.SubTotalMins) As TotalMinutes 
Where ID = Diary.ID

以上当然是垃圾,但你可以看到我正在努力解决的问题。

对于每一行,以分钟计算结束和开始之间的差异。 对于与 where 子句总和匹配的所有行。 返回总和。

有什么想法吗?

问候

【问题讨论】:

  • 能否请您添加表架构并说明这是什么平台?

标签: sql sql-server datetime


【解决方案1】:

我不确定它是否在 SQL 标准中指定,但大多数 SQL 实现都有某种确定间隔的函数。这真的要归结为您使用的是什么风格的 SQL。

如果您使用的是 Oracle/PLSQL:

SELECT NumToDSInterval(enddate- startdate, 'MINUTE') FROM MyTable

在 SQL Server/T-SQL 中:

SELECT DateDiff(n, startdate, enddate) FROM MyTable

在 MySQL 中:

SELECT SubTime(enddate, startdate) FROM MyTable;

我确定有一个用于 SQLite 和 PostGre 以及任何其他风格。

【讨论】:

  • 感谢 DateDiff 就足够了 :-) 完美的功能满足我的需要,其余的很容易。谢谢
  • 如果 T-SQL 是您正在使用的风格,请确保您也查看 gbn 的解决方案。他使用的按日期分组的方法是迄今为止最有效的方法。
【解决方案2】:

如果我理解正确(至少对于 SQL Server)...

SELECT
    SUM(DATEDIFF(minute, StartTime, EndTime)),
    DATEADD(DAY, DATEDIFF(DAY, 0, StartTime), 0) AS [Date]
FROM
    Diary
WHERE
    DiaryID = @ID
GROUP BY
    DiaryID /* in case for all DiaryIDs */,
    DATEADD(DAY, DATEDIFF(DAY, 0, StartTime), 0)

注意:这会从“日期时间”值中删除时间部分。通过计算从零开始的天数(= 1900 年 1 月 1 日)来工作。 It's the most efficient

DATEADD(DAY, DATEDIFF(DAY, 0, StartTime), 0)

DATEDIFF in MSDN

【讨论】:

  • 鉴于 OP 似乎对 DateDiff 不熟悉,我建议添加对 DATEADD(DAY, DATEDIFF(DAY, 0, StartTime), 0) 作用的解释。
  • 这是一个我以前没有遇到过的功能,但现在效果很好。谢谢。只需要弄清楚如何接受答案。
  • 在寻找最有效的日期计算时,我实际上已经看过几次 dateadd+datediff 了。我试图说服我的 DBA 将这个和一些类似的(月初、月底等)作为函数添加到主数据库中。
  • 我不得不说它们非常值得,在过去的 12 小时里,我创建了 50 个实现了这些功能的视图,这意味着我们的一些直播网络流量下降了大约 20%报告,通常流量不是问题,但减少总是好的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-14
  • 1970-01-01
相关资源
最近更新 更多