【问题标题】:How to calculate Saturday in between two dates in SQL Server如何在 SQL Server 中计算两个日期之间的星期六
【发布时间】:2017-09-14 16:46:03
【问题描述】:

星期在星期六结束,新的一周从星期日开始。

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

  • 开始日期 - 09/11/2018 - 星期五
  • 结束日期 - 2018 年 12 月 11 日 - 星期一

  • 总天数 = 4

我想将日子和最终结果分开

  • 开始日期 - 09/11/2018 - 星期五
  • 日期 1 - 2018 年 10 月 11 日 - 星期六
  • 总天数 = 2

  • 日期 2 - 2018 年 11 月 11 日 - 星期日

  • End_date - 2018 年 12 月 11 日 - 星期一
  • 总天数 = 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

请帮忙。

感谢和问候, 虚拟机

【问题讨论】:

  • 使用tally table
  • 您要计算两个日期之间的天数吗?然后使用 datediff() 函数。

标签: sql-server


【解决方案1】:

这将从你的 Date1 计算你的 Date2

print dateadd(day,-1,dateadd(wk,datepart(wk,'4/5/2017'),'1/1/2017'))

【讨论】:

  • 亲爱的,感谢您的及时回复...非常感谢。我将尝试帖子中给出的几个解决方案,并在周末更新您。热烈的问候VG
【解决方案2】:

如果我没记错的话,你正在寻找这样的东西:

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

【讨论】:

  • 亲爱的 Mohammad,感谢您的解决方案......它就像一个魅力。
【解决方案3】:

这是一种方法。我无法找到使用递归 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 |
+-------------------------+-------------------------+-----------+

【讨论】:

    猜你喜欢
    • 2012-01-28
    • 2011-11-25
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    相关资源
    最近更新 更多