SQL语句求助!!求具体算法,谢谢!!

evelyn1018 2017-07-21 09:33:03
数据格式为:开始时间:2017/7/10 17:12:25 结束时间:2017/7/10 19:36:18
开始时间:2017/7/10 10:33:42 结束时间:2017/7/11 08:21:15
开始时间:2017/7/9 13:32:40 结束时间:2017/7/10 15:40:53
需要计算每天的时长(单位hour);
计算方法为:①当天开始当天结束的,两个时间相减即可;②当天开始,改天结束的,用当天24点减去开始时间;
③不是当天开始,但是当天结束的,用结束时间减去当天0点;
最后7月10日的时长为:①②③的均值。每天的时长都是这样计算,如何方便地计算每天的时长?
求助详细算法,谢谢!!!
...全文
348 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhouyuehai1978 2017-07-21
  • 打赏
  • 举报
回复
可以考虑把跨天的都拆开成具体到某一天的多条记录,然后按照日期sum就可以了 比如你是7月5日13点到7月7日5点,那你拆成7月5日13点到24点,7月6日0点到24点,7月7日0点到5点3条,然后就好算了。
zhouyuehai1978 2017-07-21
  • 打赏
  • 举报
回复
--测试数据
IF NOT OBJECT_ID(N'Tempdb..#T') IS NULL
DROP TABLE #T
GO
CREATE TABLE #T
(
StartTime DATETIME,
EndTime DATETIME
)
INSERT #T
SELECT '2017/7/10 17:12:25',
'2017/7/10 19:36:18' UNION ALL
SELECT '2017/7/10 10:33:42',
'2017/7/11 08:21:15' UNION ALL
SELECT '2017/7/9 13:32:40',
'2017/7/10 15:40:53'
GO
--测试数据结束
DECLARE @mintime DATETIME,
@maxtime DATETIME

SELECT @mintime = MIN(t.StartTime),
@maxtime = MAX(t.EndTime)
FROM #T AS t;
WITH days AS (
SELECT CONVERT(DATE, @mintime) AS dd
UNION ALL
SELECT DATEADD(DAY, 1, d.dd) AS dd
FROM days AS d
WHERE d.dd < CONVERT(DATE, @maxtime)
)

SELECT d.dd,
AVG(
CASE
WHEN CONVERT(DATE, t.StartTime) < d.dd THEN CASE
WHEN CONVERT(DATE, t.EndTime) = d.dd THEN DATEDIFF(hour, d.dd, t.EndTime)
WHEN CONVERT(DATE, t.EndTime) > d.dd THEN 24
END
WHEN CONVERT(DATE, t.StartTime) = d.dd THEN CASE
WHEN CONVERT(DATE, t.EndTime) = d.dd THEN DATEDIFF(hour, t.StartTime, t.EndTime)
WHEN CONVERT(DATE, t.EndTime) > d.dd THEN DATEDIFF(hour, t.StartTime, DATEADD(DAY, 1, d.dd))
END
END
) AS avghour
FROM #T AS t
JOIN days AS d
ON 1 = 1
GROUP BY
d.dd

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧