Sql-Server

獲取日期範圍之間的數據

  • April 30, 2021

我有一系列表格數據,其中包含兩列日期開始日期結束日期,我想獲取所有內容,無論是在 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;

結果

db<>小提琴展示

引用自:https://dba.stackexchange.com/questions/290732