我有一个基于时间戳的数据集,即startdate、enddate。我想计算两个时间戳之间的营业小时数,比如说一个典型的(M-F,8-5)周。
例如,如果一张票在星期一早上8:00进来,星期二上午9:00关闭,我希望语句显示10小时。我还需要从计算中省略周末。有人能推荐一种解决这个问题的方法吗?谢谢你的帮助。
发布于 2014-08-28 04:15:06
作为一个例子(在我面前没有你的表结构),这是我根据我为generating rows for time做的另一个答案得出的结论。
declare @datetimes table (id int primary key identity(1,1), startdatetime datetime, enddatetime datetime)
insert into @datetimes (startdatetime,enddatetime) values
('2014-08-26 08:00:00','2014-08-27 09:00:00')
, ('2014-07-16 08:00:00','2014-07-28 09:00:00')
declare @defaultDayStart time = '08:00:00', @defaultDayEnd time = '17:00:00'
select T.ID, sum(Z.ShadowHours)
from (
select id, startdatetime, enddatetime, datediff(hh,startdatetime,enddatetime) TotalTime
from @datetimes
) T
CROSS APPLY (
SELECT
RowID-1 AS ShadowDays
, CASE
WHEN DATENAME(dw,DATEADD(dd, RowID - 1,t.startdatetime)) IN ('Saturday', 'Sunday') THEN 0
ELSE DATEDIFF(hh, CASE RowID WHEN MIN(RowID)OVER(PARTITION BY t.id) THEN t.startdatetime ELSE CONVERT(DATETIME,CONVERT(DATE, DATEADD(dd, RowID - 1,t.startdatetime))) + @defaultDayStart END
, CASE RowID WHEN MAX(RowID)OVER(PARTITION BY t.id) THEN t.enddatetime ELSE CONVERT(DATETIME,CONVERT(DATE, DATEADD(dd, RowID - 1,t.startdatetime))) + @defaultDayEnd END
)
END AS ShadowHours
, DATENAME(dw,DATEADD(dd, RowID - 1,t.startdatetime)) wd
FROM (
SELECT ROW_NUMBER()OVER(ORDER BY S.NAME) AS RowID
FROM master..spt_values S
) X
WHERE DATEDIFF(dd,startdatetime,enddatetime) + 1 >= RowID
) Z
GROUP BY T.id
这个示例很简单,并且没有使用包含例如假日的日程表。这也没有计算午餐时间,因为大多数地方认为每天8小时不给予某种形式的用餐休息是非法的。这些都是您可能会被要求调整的考虑因素。编辑您的问题,如果您希望在此领域获得帮助,请给我留下评论。
https://stackoverflow.com/questions/25535948
复制相似问题