0

我为措辞不当的标题道歉,我被赋予了一项超出我有限技能的任务,并希望有人能提供帮助。

我们的员工有 24/7 的日程安排来预订工作和现场任务(周末也是如此),但这不适用于假期。因此,我的任务是在周末分解一个日期范围(并排除它们)

例如:

开始日期: 30/04/2015结束日期: 13/05/2015

30/04/2015, 01/05/2015
04/05/2015, 05/05/2015, 06/05/2015, 07/05/2015, 08/05/2015,
11/05/2015, 12/05/2015, 13/05/2015,

注意:周末已被排除,日期范围已在三周内分为三个。

最好:包括每个范围的起点和终点,如下所示

30/04/2015 - 01/05/2015 --(the same as it is the start and end dates)
04/05/2015 - 08/05/2015
11/05/2015 - 13/05/2015

由于我的知识非常有限,我不知道这是否可能,希望我已经解释得足够多,以便某个善良的灵魂可能会看到这样的事情是否可能。

我们使用的数据库应用程序是 SQL 2008 上的 TSQL。

非常感谢。

4

2 回答 2

0

感谢有趣的问题。注意:我使用标准的日期格式,但概念是一样的。

DECLARE @StartDate  DATE = '20150430',  --April 30, 2015
        @EndDate    DATE = '20150513';  --May 13,2015

WITH CTE_Dates
AS
(
    SELECT @StartDate dates
    UNION ALL
    SELECT DATEADD(DAY,1,dates)
    FROM CTE_Dates
    WHERE dates < @EndDate
),
CTE_weeks
AS
(
    SELECT  dates,
            DATEPART(WEEK,dates) WeekID
    FROM CTE_Dates
    WHERE DATENAME(WEEKDAY,dates) NOT IN ('Saturday','Sunday') --doesn't include weekends
)

SELECT  WeekID,
        MIN(dates) StartDate,
        MAX(dates) EndDate,
        STUFF(list_dates,1,1,'') list
FROM CTE_weeks A
CROSS APPLY (
                SELECT ',' + CAST(dates AS VARCHAR(100))
                FROM CTE_weeks B
                WHERE A.WeekID = B.WeekID
                ORDER BY dates
                FOR XML PATH('')
            ) CA(list_dates)
GROUP BY WeekID,STUFF(list_dates,1,1,'')

结果:

WeekID      StartDate  EndDate    list
----------- ---------- ---------- ------------------------------------------------------------
18          2015-04-30 2015-05-01 2015-04-30,2015-05-01
19          2015-05-04 2015-05-08 2015-05-04,2015-05-05,2015-05-06,2015-05-07,2015-05-08
20          2015-05-11 2015-05-13 2015-05-11,2015-05-12,2015-05-13
于 2015-05-13T14:43:12.940 回答
-1

这似乎有效。它假设你给它一个工作日的开始日期:

declare @StartDate datetime = '20150430'
declare @EndDate datetime = '20150513'

; With Ord as (
    select @StartDate as StartAt,@StartDate as EndAt
    union all
    select StartAt,DATEADD(day,1,EndAt)
    from Ord where DATEPART(weekday,EndAt) != DATEPART(weekday,'20150710') --Known Friday
    and EndAt < @EndDate
    union all
    select DATEADD(day,3,EndAt),DATEADD(day,3,EndAt)
    from Ord where DATEPART(weekday,EndAt) = DATEPART(weekday,'20150710') --Still known Friday
    and DATEADD(day,3,EndAt) <= @EndDate
)
select StartAt,MAX(EndAt) as EndAt
from Ord
group by StartAt

结果:

StartAt                 EndAt
----------------------- -----------------------
2015-04-30 00:00:00.000 2015-05-01 00:00:00.000
2015-05-04 00:00:00.000 2015-05-08 00:00:00.000
2015-05-11 00:00:00.000 2015-05-13 00:00:00.000

我对DATEPART周五使用“已知良好”(即我只是从日历中随机选择一个)进行比较,以便此代码适用于任何DATEFIRST设置。

于 2015-05-13T14:46:17.293 回答