Sql-Server
獲取日期範圍之間的數據
我有一系列表格數據,其中包含兩列日期開始日期和結束日期,我想獲取所有內容,無論是在 21 年 3 月 5 日星期一開始/結束,還是在 21 年 9 月 5 日星期日開始/結束,以及所有內容通常在一周的工作量之間。
例如
派生的星期一開始日期:03/05/2021
派生的星期日結束日期:09/05/2021
派生的星期一結束日期:10/05/2021
我最初寫了下面的語法來解決每週一的選擇,因為報告將在每週四執行,但查詢沒有產生正確的結果,我知道這可能是由於過度使用 AND 和 OR - 我在 SQL 世界中非常新所以對此的任何幫助將不勝感激。
WHERE StartDate >= CAST(GETDATE()+4 AS date) AND EndDate <= CAST(GETDATE()+14 AS date) OR StartDate <= CAST(GETDATE()+4 AS date) AND EndDate >= CAST(GETDATE()+4 AS date) OR StartDate >= CAST(GETDATE()+14 AS date) AND EndDate <= CAST(GETDATE()+14 AS date)
我也在下面嘗試過,但這個公式並沒有選擇正在進行的工作:
StartDate BETWEEN CAST(GETDATE()+4 AS Date) AND DATEADD(week, 2, CAST(GETDATE() AS Date))
ID Start Date End Date 1 20/04/2021 07/05/2021 2 05/06/2021 06/06/2021 3 04/05/2021 30/06/2021 4 20/05/2021 30/05/2021 5 05/04/2019 06/06/2021 6 24/06/2018 31/10/2023 7 05/05/2021 06/05/2021 8 07/05/2021 08/05/2021 9 27/11/2020 05/05/2021 10 09/05/2021 10/05/2021
我想選擇週一開始或結束或週日開始或結束的所有內容,以及一周範圍內的所有內容。我想要下週 03/05/21 - 10/05/21 之間的數據,因此查詢應該選擇 ID:1、3、7、8、9、10。遺憾的是,我不能使用任何固定日期作為數據想要,是在每週一和周日之間。
sql server 的預設日期格式為 yyyymmdd,如範例所示
你需要做的是找到一個算法來獲得想要的日期
CREATE TABLE table1 ( ID INTEGER, StartDate DATE, EndDate DATE ); INSERT INTO table1 (ID, StartDate, EndDate) VALUES ('1', '20210420', '2021-05-07'), ('2', '20210605', '20210606'), ('3', '20210501', '20210630'), ('4', '20210520', '20210530'), ('5', '20210429', '20210430'), ('6', '20210429', '20210429'), ('7', '20210505', '20210506'), ('8', '20210507', '20210508'), ('9', '20210510', '20210512'), ('10', '20210509', '20210510'); GO
SELECT DATEADD(DAY, (DATEDIFF(DAY, 0, GETDATE()) / 7) * 7 + 14, 0) AS NextDay
GO
| 第二天 | | :---------------------- | | 2021-05-10 00:00:00.000 |
SELECT DATEADD(DAY, (DATEDIFF(DAY, 6, GETDATE()) / 7) * 7 + 14, 6) AS NextDay GO
| 第二天 | | :---------------------- | | 2021-05-09 00:00:00.000 |
SELECT ID, StartDate, EndDate FROM table1 WHERE StartDate >= DATEADD(DAY, (DATEDIFF(DAY, 0, GETDATE()) / 7) * 7 + 7, 0) AND (EndDate <= DATEADD(DAY, (DATEDIFF(DAY, 6, GETDATE()) / 7) * 7 + 14, 6) OR EndDate <= DATEADD(DAY, (DATEDIFF(DAY, 0, GETDATE()) / 7) * 7 + 14, 0)) GO
身份證 | 開始日期 | 結束日期 -: | :--------- | :--------- 7 | 2021-05-05 | 2021-05-06 8 | 2021-05-07 | 2021-05-08 10 | 2021-05-09 | 2021-05-10
db<>在這裡擺弄
測試台
CREATE TABLE dbo.Test ( ID integer NOT NULL, [Start Date] date NOT NULL, [End Date] date NOT NULL );
樣本數據
INSERT dbo.Test (ID, [Start Date], [End Date]) VALUES (1, CONVERT(date, '20/04/2021', 103), CONVERT(date, '07/05/2021', 103)), (2, CONVERT(date, '05/06/2021', 103), CONVERT(date, '06/06/2021', 103)), (3, CONVERT(date, '04/05/2021', 103), CONVERT(date, '30/06/2021', 103)), (4, CONVERT(date, '20/05/2021', 103), CONVERT(date, '30/05/2021', 103)), (5, CONVERT(date, '05/04/2019', 103), CONVERT(date, '06/06/2021', 103)), (6, CONVERT(date, '24/06/2018', 103), CONVERT(date, '31/10/2023', 103)), (7, CONVERT(date, '05/05/2021', 103), CONVERT(date, '06/05/2021', 103)), (8, CONVERT(date, '07/05/2021', 103), CONVERT(date, '08/05/2021', 103)), (9, CONVERT(date, '27/11/2020', 103), CONVERT(date, '05/05/2021', 103)), (10, CONVERT(date, '09/05/2021', 103), CONVERT(date, '10/05/2021', 103));
解決方案
SELECT T.* FROM dbo.Test AS T CROSS APPLY ( SELECT NM.NextMonday, SundayAfter = DATEADD(DAY, 6, NM.NextMonday) FROM ( -- See https://stackoverflow.com/questions/7168874/get-first-day-of-week-in-sql-server -- 1 Jan 1900 was a Monday SELECT NextMonday = DATEADD(WEEK, 1 + DATEDIFF(WEEK, {D '1900-01-01'}, CURRENT_TIMESTAMP), {D '1900-01-01'}) ) AS NM ) AS RF WHERE T.[Start Date] BETWEEN RF.NextMonday AND RF.SundayAfter OR T.[End Date] BETWEEN RF.NextMonday AND RF.SundayAfter;
結果