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