27,579
社区成员
发帖
与我相关
我的任务
分享
;WITH CTED(begindate,enddate,duration)
AS
(
SELECT '2016-04-14 12:00','2016-04-17 22:00',3
)
SELECT
begindate=CASE WHEN b.number=0 THEN a.begindate ELSE CONVERT(VARCHAR(10),DATEADD(dd,b.number,a.begindate),120)+' 09:00' END
,enddate=CASE WHEN a.duration=b.number THEN a.enddate ELSE CONVERT(VARCHAR(10),DATEADD(dd,b.number,a.begindate),120)+' 22:00' END
,a.duration
,a.*
FROM CTED AS a
INNER JOIN master.dbo.spt_values AS b ON b.type = 'P'
AND b.number >= 0
AND b.number <= a.duration;
/*
begindate enddate duration
2016-04-14 12:00 2016-04-14 22:00 3
2016-04-15 09:00 2016-04-15 22:00 3
2016-04-16 09:00 2016-04-16 22:00 3
2016-04-17 09:00 2016-04-17 22:00 3
*/
;WITH tb(ID,BeginDate,EndDate) AS (
SELECT 12,CONVERT(DATETIME,'2016-04-14 12:00:00'),CONVERT(DATETIME,'2016-04-17 22:00:00') UNION
SELECT 13,'2016-04-12 17:27:00','2016-04-13 17:27:00'
)
SELECT tb.ID
,CASE WHEN sv.number=1 THEN
CASE WHEN DATEADD(d,sv.number-1,BeginDate)<DATEADD(hh,9, CONVERT(VARCHAR,DATEADD(d,sv.number-1,BeginDate),23)) THEN DATEADD(hh,9, CONVERT(VARCHAR,DATEADD(d,sv.number-1,BeginDate),23)) ELSE DATEADD(d,sv.number-1,BeginDate) END
ELSE DATEADD(hh,9, CONVERT(VARCHAR,DATEADD(d,sv.number-1,BeginDate),23)) END
,CASE WHEN DATEDIFF(d, DATEADD(d,sv.number-1,BeginDate),EndDate)=0 THEN
CASE WHEN EndDate >(CONVERT(VARCHAR,EndDate,23)+' 17:30:00') THEN EndDate ELSE CONVERT(VARCHAR,EndDate,23)+' 17:30:00' END
ELSE CONVERT(VARCHAR,DATEADD(d,sv.number-1,BeginDate),23)+' 17:30:00' END
FROM tb
CROSS APPLY [master].dbo.spt_values AS sv WHERE sv.[type]='P' AND sv.number BETWEEN 1 AND DATEDIFF(d,tb.BeginDate,tb.EndDate)
/*
ID (No column name) (No column name)
12 2016-04-14 12:00:00.000 2016-04-14 17:30:00.000
12 2016-04-15 09:00:00.000 2016-04-15 17:30:00.000
12 2016-04-16 09:00:00.000 2016-04-16 17:30:00.000
13 2016-04-12 17:27:00.000 2016-04-12 17:30:00.000
*/