[英]Calculating Business Hours in SQL
I need to calculate business hours between to dates. 我需要计算到目前为止的营业时间。
I need to exclude following from that hours. 我需要从那几个小时中排除关注。
For holidays I have a table HOLIDAYS as 对于假期,我有一张桌子HOLIDAYS作为
DATE NAME ---------------------------------- 2012-01-02 New Year's Day 2012-04-06 Good Friday 2012-04-09 Easter Monday
Notes: 笔记:
1. I have hours in start and finish dates ('2012/03/15 14:00' to '2012/03/22 17:30'). 1.我有几个小时的开始和结束日期(从'2012/03/15 14:00'到'2012/03/22 17:30')。
2. I'm using Sql Server 2005 so I don't have datetypes DATE or TIME. 2.我使用的是Sql Server 2005,所以没有日期类型DATE或TIME。
Try this. 尝试这个。
DECLARE @start_date DATETIME
DECLARE @stop_date DATETIME
DECLARE @days INT
SELECT @start_date = '2012/03/15 14:00', @stop_date = '2012/03/22 17:30'
SELECT @days = DATEDIFF(DAY, CAST(FLOOR(CAST(@start_date AS FLOAT)) AS DATETIME), CAST(FLOOR(CAST(@stop_date AS FLOAT)) AS DATETIME)) + 1
;WITH CTE_ALL_DAYS AS (
SELECT TOP (@days)
DATEADD(DAY, rn, CAST(FLOOR(CAST(@start_date AS FLOAT)) AS DATETIME)) AS dt
FROM (
SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) - 1 AS rn
FROM master.sys.all_columns AS a
CROSS JOIN master.sys.all_columns AS b
) AS tally
)
SELECT SUM(
CASE
WHEN dt = CAST(FLOOR(CAST(@start_date AS FLOAT)) AS DATETIME) THEN
CASE
WHEN DATEDIFF(HOUR, @start_date, DATEADD(HOUR, 18, CAST(FLOOR(CAST(@start_date AS FLOAT)) AS DATETIME))) > 9 THEN 9
WHEN DATEDIFF(HOUR, @start_date, DATEADD(HOUR, 18, CAST(FLOOR(CAST(@start_date AS FLOAT)) AS DATETIME))) > 0 THEN DATEDIFF(HOUR, @start_date, DATEADD(HOUR, 18, CAST(FLOOR(CAST(@start_date AS FLOAT)) AS DATETIME)))
ELSE 0
END
WHEN dt = CAST(FLOOR(CAST(@stop_date AS FLOAT)) AS DATETIME) THEN
CASE
WHEN DATEDIFF(HOUR, DATEADD(HOUR, 9, CAST(FLOOR(CAST(@stop_date AS FLOAT)) AS DATETIME)), @stop_date) > 9 THEN 9
WHEN DATEDIFF(HOUR, DATEADD(HOUR, 9, CAST(FLOOR(CAST(@stop_date AS FLOAT)) AS DATETIME)), @stop_date) > 0 THEN DATEDIFF(HOUR, DATEADD(HOUR, 9, CAST(FLOOR(CAST(@stop_date AS FLOAT)) AS DATETIME)), @stop_date)
ELSE 0
END
ELSE 9
END
)
FROM CTE_ALL_DAYS
WHERE
NOT DATEPART(weekday, dt) IN (1, 7)
AND NOT dt IN (SELECT [DATE] FROM HOLIDAYS)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.