在这里有一个很好的搜索,但看不到任何让我想到的东西。
基本上我有一个表调用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的所有行。 归还总和。
有什么想法吗?
问候
答案 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)