SQL查询包括时间计算

时间:2009-10-26 22:06:04

标签: sql sql-server datetime

在这里有一个很好的搜索,但看不到任何让我想到的东西。

基本上我有一个表调用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

以上是垃圾,但你可以看到我想要解决的问题。

对于每一行,计算End和Start之间的差异,以分钟为单位。 对于匹配where子句sum的所有行。 归还总和。

有什么想法吗?

问候

2 个答案:

答案 0 :(得分:3)

我不确定它是在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以及任何其他风格。

答案 1 :(得分: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)

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

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

DATEDIFF in MSDN