周六周六结束,新周周日开始。
我想在SQL Server中确定星期六和分割日期的日期。示例如下:
End_date - 12/11/2018 - 星期一
总天数= 4
我想把日期和结果分成
总天数= 2
Date2 - 11/11/2018 - Sunday
另一个例子(如果星期六的数量更多,则为start_date和end_date)
然后结果如下: -
Date1 Date2 no. of days.
------------------------------------
04/05/2017 06/05/2017 3
07/05/2017 13/05/2017 7
14/05/2017 20/05/2017 7
21/05/2017 27/05/2017 7
28/05/2017 31/05/2017 4
请帮忙。
谢谢&问候, VG
答案 0 :(得分:0)
如果我没弄错的话,你正在寻找这样的事情:
DECLARE @StartDate DATE = '2017-05-04'
DECLARE @EndDate DATE = '2017-05-31'
DECLARE @OutputTABLE AS TABLE
(
StartDate DATE NOT NULL,
EndDate DATE NOT NULL
)
DECLARE @NumberOfWeeks INT = DATEDIFF(week, @StartDate, @EndDate)
DECLARE @Counter INT = 0
DECLARE @TempDate DATE = DATEADD(week, @Counter, @StartDate)
WHILE @NumberOfWeeks >= 0
BEGIN
IF @NumberOfWeeks = 0
BEGIN
INSERT INTO @OutputTABLE VALUES (@TempDate, @EndDate);
END
ELSE
BEGIN
INSERT INTO @OutputTABLE VALUES (@TempDate, DATEADD(DAY, -1, DATEADD(week, DATEDIFF(week ,0 , @TempDate) + 1, -1)));
END
SET @TempDate = DATEADD(week, @Counter + 1, DATEADD(day, -1, DATEADD(week, DATEDIFF(week, 0, @StartDate), 0)))
SET @NumberOfWeeks = @NumberOfWeeks - 1
SET @Counter = @Counter + 1
END
SELECT StartDate,
EndDate,
DATEDIFF(day, StartDate, EndDate) + 1 AS NumberOfDays
FROM @OutputTABLE
答案 1 :(得分:0)
这是一种方法。我无法找到递归CTE的方法,因为你不能在递归CTE的递归部分进行聚合。
DECLARE @MinDate DATE = '20170504',
@MaxDate DATE = '20170531'
DECLARE @StartDate datetime, @EndDate datetime
--DATE TABLE... ONE ROW FOR EVERY DAY IN RANGE
IF OBJECT_ID('tempdb..#DateTable') IS NOT NULL DROP TABLE #DateTable
SELECT TOP (DATEDIFF(DAY, @MinDate, @MaxDate) + 1)
Dates = DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.object_id) - 1, @MinDate)
INTO #DateTable
FROM sys.all_objects a
CROSS JOIN sys.all_objects b
IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Results
CREATE TABLE #Results (Date1 DATETIME, Date2 DATETIME, NumOfDays INT)
--INSERT FIRST ROW IN CASE IT STARTS ON A DAY OTHER THAN SUNDAY
INSERT INTO #Results
SELECT
MIN(Dates) as Date1
,MIN(CASE WHEN DATEPART(WEEKDAY,Dates) = 7 THEN Dates END) as Date2
,DATEDIFF(DAY,MIN(Dates),MIN(CASE WHEN DATEPART(WEEKDAY,Dates) = 7 THEN Dates END)) + 1 as NoOfDays
FROM #DateTable
SET @StartDate = (SELECT MIN(CASE WHEN DATEPART(WEEKDAY,Dates) = 1 THEN Dates END) FROM #DateTable)
SET @EndDate = (SELECT MAX(CASE WHEN DATEPART(WEEKDAY,Dates) = 1 THEN Dates END) FROM #DateTable)
--INSERT ALL FULL WEEKS
WHILE @StartDate < @EndDate
BEGIN
INSERT INTO #Results
SELECT
MIN(Dates) as Date1
,MIN(CASE WHEN DATEPART(WEEKDAY,Dates) = 7 THEN Dates END) as Date2
,DATEDIFF(DAY,MIN(Dates),MIN(CASE WHEN DATEPART(WEEKDAY,Dates) = 7 THEN Dates END)) + 1 as NoOfDays
FROM #DateTable
WHERE Dates >= @StartDate
SET @StartDate = DATEADD(DAY,7,@StartDate)
END
--INSERT LAST ROW IF IT ISN'T A FULL WEEK
IF (SELECT MAX(Date2) FROM #Results) <> @MaxDate
BEGIN
INSERT INTO #Results
SELECT
MIN(Dates) as Date1
,MAX(Dates) as Date2
,DATEDIFF(DAY,MIN(Dates),MAX(Dates)) + 1 as NoOfDays
FROM #DateTable
WHERE Dates > (SELECT MAX(Date2) FROM #Results)
END
SELECT * FROM #Results
DROP TABLE #Results
DROP TABLE #DateTable
<强>返回强>
+-------------------------+-------------------------+-----------+
| Date1 | Date2 | NumOfDays |
+-------------------------+-------------------------+-----------+
| 2017-05-04 00:00:00.000 | 2017-05-06 00:00:00.000 | 3 |
| 2017-05-07 00:00:00.000 | 2017-05-13 00:00:00.000 | 7 |
| 2017-05-14 00:00:00.000 | 2017-05-20 00:00:00.000 | 7 |
| 2017-05-21 00:00:00.000 | 2017-05-27 00:00:00.000 | 7 |
| 2017-05-28 00:00:00.000 | 2017-05-31 00:00:00.000 | 4 |
+-------------------------+-------------------------+-----------+
答案 2 :(得分:-1)
这将从Date1计算你的Date2
print dateadd(day,-1,dateadd(wk,datepart(wk,'4/5/2017'),'1/1/2017'))