获取两个日期SQL之间的工作日数(星期日,星期一,星期二)

Ste*_*eph 1 sql t-sql datetime sql-server-2005 sql-server-2008

因此,对于开始日期和结束日期,我想确定这两个日期之间一周的特定日期.

那么星期一,星期二等等

我知道我可以在开始日期和结束日期之间循环并检查每一天,但差异可能是很多天.我更喜欢不需要循环的东西.有任何想法吗?(必须在SQL Server 2005+中受支持)

Tom*_*m H 8

鉴于我认为你想要得到的,这应该做到:

SET DATEFIRST 1

DECLARE
    @start_date DATETIME,
    @end_date DATETIME

SET @start_date = '2011-07-11'
SET @end_date = '2011-07-22'

;WITH Days_Of_The_Week AS (
    SELECT 1 AS day_number, 'Monday' AS day_name UNION ALL
    SELECT 2 AS day_number, 'Tuesday' AS day_name UNION ALL
    SELECT 3 AS day_number, 'Wednesday' AS day_name UNION ALL
    SELECT 4 AS day_number, 'Thursday' AS day_name UNION ALL
    SELECT 5 AS day_number, 'Friday' AS day_name UNION ALL
    SELECT 6 AS day_number, 'Saturday' AS day_name UNION ALL
    SELECT 7 AS day_number, 'Sunday' AS day_name
)
SELECT
    day_name,
    1 + DATEDIFF(wk, @start_date, @end_date) -
        CASE WHEN DATEPART(weekday, @start_date) > day_number THEN 1 ELSE 0 END -
        CASE WHEN DATEPART(weekday, @end_date)   < day_number THEN 1 ELSE 0 END
FROM
    Days_Of_The_Week
Run Code Online (Sandbox Code Playgroud)


KM.*_*KM. 6

我不确定OP之后是什么,这将每周计算一次:

SET DATEFIRST 1
DECLARE @StartDate datetime
       ,@EndDate datetime
SELECT @StartDate='7/13/2011'
      ,@EndDate='7/28/2011'
;with AllDates AS
(
    SELECT @StartDate AS DateOf, datename(weekday,@StartDate) AS WeekDayName, datepart(weekday,@StartDate) AS WeekDayNumber
    UNION ALL
    SELECT DateOf+1, datename(weekday,DateOf+1), datepart(weekday,DateOf+1)
        FROM AllDates
    WHERE DateOf<@EndDate
)
SELECT COUNT(*) CountOf,WeekDayName  FROM AllDates GROUP BY WeekDayName,WeekDayNumber ORDER BY WeekDayNumber
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

CountOf     WeekDayName
----------- ------------------------------
2           Monday
2           Tuesday
3           Wednesday
3           Thursday
2           Friday
2           Saturday
2           Sunday

(7 row(s) affected)
Run Code Online (Sandbox Code Playgroud)

这将计算周一至周五的日期:

SET DATEFIRST 1
DECLARE @StartDate datetime
       ,@EndDate datetime
SELECT @StartDate='7/13/2011'
      ,@EndDate='7/28/2011'
;with AllDates AS
(
    SELECT @StartDate AS DateOf, datepart(weekday,@StartDate) AS WeekDayNumber
    UNION ALL
    SELECT DateOf+1, datepart(weekday,DateOf+1)
        FROM AllDates
    WHERE DateOf<@EndDate
)
SELECT COUNT(*) AS WeekDayCount FROM AllDates WHERE WeekDayNumber<=5
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

WeekDayCount
------------
12

(1 row(s) affected)
Run Code Online (Sandbox Code Playgroud)

如果您有假期表,您可以加入并删除它们.这是一个稍微不同的版本,可以更好地执行:

SET DATEFIRST 1
DECLARE @StartDate datetime
       ,@EndDate datetime
SELECT @StartDate='7/13/2011'
      ,@EndDate='7/28/2011'
;with AllDates AS
(
    SELECT @StartDate AS DateOf, datepart(weekday,getdate()) AS WeekDayNumber
    UNION ALL
    SELECT DateOf+1, (WeekDayNumber+1) % 7
        FROM AllDates
    WHERE DateOf<@EndDate
)
SELECT COUNT(*) AS WeekDayCount FROM AllDates WHERE WeekDayNumber>0 AND WeekDayNumber<6
--I don't like using "BETWEEN", ">", ">=", "<", and "<=" are more explicit in defining end points
Run Code Online (Sandbox Code Playgroud)

产生与原始查询相同的输出.