如何在SQL Server中的两个日期之间计算星期六

时间:2017-04-18 17:51:35

标签: sql-server

周六周六结束,新周周日开始。

我想在SQL Server中确定星期六和分割日期的日期。示例如下:

  • Start_date - 09/11/2018 - Friday
  • End_date - 12/11/2018 - 星期一

  • 总天数= 4

我想把日期和结果分成

  • Start_date - 09/11/2018 - Friday
  • Date1 - 10/11/2018 - Saturday
  • 总天数= 2

  • Date2 - 11/11/2018 - Sunday

  • End_date - 12/11/2018 - 星期一
  • 总天数= 2

另一个例子(如果星期六的数量更多,则为start_date和end_date)

  • 开始日期 - 04/05/2017
  • end_date - 31/05/2017

然后结果如下: -

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

3 个答案:

答案 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'))