給定一個日期范圍,我想回傳屬于該范圍的所有星期六和星期日,條件是:
- 只有當星期六的序號為0時,才包括星期六。
- 僅當星期六的順序位置是其所在月份的第1個或第3個星期六時,才包括星期六(不是在整個范圍內)。
- 包括所有的星期日,以及該星期日在該月內的順序位置。
因此,舉例來說,如果開始日期是2021年8月15日,結束日期是2021年9月20日,輸出結果將是:
Dates Saturday Number (in its own month)
---------- ---------------
2021-08-21 3
2021-09-04 1
2021-09-18 3
日期 星期天 編號(在它自己的月份里
---------- ---------------
2021-08-15 3
2021-08-22 4
2021-08-29 5
2021-09-05 1
2021-09-12 2
2021-09-19 3
然后我可以將日期范圍合計(37天),并減去星期日(6),以及每個月的第1和第3個星期六(3),最后得出28天。
試了一下這個查詢
DECLARE @sd DATETIME = '2021-08-15' DECLARE @ed DATETIME=
'2021-09-20'
--尋找第一個星期六 WHILE DATEPART(dw, @sd)<>7 BEGIN SET @sd = DATEADD(dd,1,@sd) END
--獲取下一個星期六;with Saturdays AS ()
--初始值 SELECT @sd AS MyDate, 1 AS SatNo UNION ALL
--遞回部分 SELECT DATEADD(dd,7,MyDate) AS MyDate, CASE WHEN SatNo 1 =6 THEN 1 ELSE SatNo 1 END AS SatNo FROM Saturdays
WHERE DATEADD(dd,7,MyDate)<=@ed)
) SELECT * FROM Saturdays WHERE SatNo IN (1, 3) OPTION(MAXRECURSION 0)
它不能正常作業。
也試過這個方案 在SQL中獲取兩個日期之間的周末數。 來計算作業日,但我只想要第1個和第3個星期六以及所有的星期日
。uj5u.com熱心網友回復:
獲得一個日歷表;它使這種型別的業務問題變得輕而易舉。這里有一個更簡單的問題:
CREATE TABLE dbo.Calendar
(
TheDate date PRIMARY KEY,
WeekdayName AS (CONVERT(varchar(8),DATENAME(WEEKDAY,TheDate))。
WeekdayInstanceInMonth tinyint
);
;WITH x(d) AS --用2020 -> 2029填充
(
SELECT CONVERT(date, '202001')
UNION ALL
SELECT DATEADD(DAY, 1, d)
FROM x
WHERE d < '20291231'INSERT dbo.Calendar(TheDate)
SELECT d FROM x
OPTION(MAXRECURSION 0)。
;WITH c as
(
SELECT *, rn = ROW_NUMBER() OVER.
(PARTITION BY YEAR(TheDate), MONTH(TheDate), WeekdayName
ORDER BYTheDate)
FROM dbo.Calendar
)
UPDATE c SET WeekdayInstanceInMonth = rn;
現在你的查詢很容易了:
DECLARE @start date = '20210815'。@end date = '20210920';
SELECT Dates = TheDate,
[星期六號碼] = WeekdayInstanceInMonth
FROM dbo.Calendar
WHERETheDate >= @start
and TheDate <= @ end
and WeekdayName = 'Saturday'
and WeekdayInstanceInMonth IN (1,3) 。
SELECT Dates = TheDate,
[星期日號碼] = WeekdayInstanceInMonth
FROM dbo.Calendar
WHERETheDate >= @start
and TheDate <= @ end
and WeekdayName = '星期日'。
Dates Saturday Number
---------- ---------------
2021-08-21 3
2021-09-04 1
2021-09-18 3
日期 星期天 編號
---------- ---------------
2021-08-15 3
2021-08-22 4
2021-08-29 5
2021-09-05 1
2021-09-12 2
2021-09-19 3
而要得到的只是數字28:
DECLARE @start date = '20210815'。@end date = '20210920';
SELECT DATEDIFF(DAY, @start, @end) 1
-
(SELECT COUNT(*)
FROM dbo.Calendar
WHERETheDate >= @start
and TheDate <= @ end
and WeekdayName = 'Saturday'
AND WeekdayInstanceInMonth IN (1,3)
-
(SELECT COUNT(*)
FROM dbo.Calendar
WHERETheDate >= @start
and TheDate <= @ end
and WeekdayName = 'Sunday')。)
uj5u.com熱心網友回復:
假設datefirst被設定為周日:
(
day(dt)
datepart(weekday, dateadd(dt, 1 - day(dt)) % 7)
) / 7 as PriorSaturdaysInMonth,
(
日(dt) - 1
datepart(weekday, dateadd(dt, 1 - day(dt))
) / 7 as PriorSundaysInMonth
對于一個給定的日期,它基本上是計算一個月內的周數(0-5),相對于星期六/星期日。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/307272.html
標籤:

