Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server TSQL-SQL 2008-在一个日期范围内(从开始日期到结束日期),是否可以在周末之前(不包括周末)将该范围拆分为单独的行?_Sql Server_Sql Server 2008_Tsql_Date_Weekend - Fatal编程技术网

Sql server TSQL-SQL 2008-在一个日期范围内(从开始日期到结束日期),是否可以在周末之前(不包括周末)将该范围拆分为单独的行?

Sql server TSQL-SQL 2008-在一个日期范围内(从开始日期到结束日期),是否可以在周末之前(不包括周末)将该范围拆分为单独的行?,sql-server,sql-server-2008,tsql,date,weekend,Sql Server,Sql Server 2008,Tsql,Date,Weekend,我为这个措辞拙劣的标题道歉,我被赋予了一项超出我有限技能范围的任务,希望有人能帮助我 我们的员工有24/7的工作和现场任务预约时间表(周末也有),但这不适用于假期。正因为如此,我的任务是在周末打破单一的约会范围(并将其排除在外) 例如: 开始日期:2015年4月30日结束日期:2015年5月13日 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

我为这个措辞拙劣的标题道歉,我被赋予了一项超出我有限技能范围的任务,希望有人能帮助我

我们的员工有24/7的工作和现场任务预约时间表(周末也有),但这不适用于假期。正因为如此,我的任务是在周末打破单一的约会范围(并将其排除在外)

例如:

开始日期:2015年4月30日结束日期:2015年5月13日

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


非常感谢。

谢谢你给我这个有趣的问题。注:我使用标准日期格式,但概念相同

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,'')

这似乎奏效了。它假设您给它一个工作日的开始日期:

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

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

我认为您在这里假设了一个特定的
DATEFIRST
设置-无法保证
工作日
值是周末。例如,
SET DATEFIRST 4;选择DATEPART(工作日,'20150509')
返回3。您是正确的,因此我将其改为DATENAME。这将问题转移到对用户有效的语言设置上。感谢您的帮助!感谢编辑Stephanalways乐于听取反馈,匿名投票人。当然不是我,非常感谢你的时间和努力,这对我的任务有很大帮助+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