Sql-Server

如何在兩個給定日期之間每週從數據庫中獲取數據?

  • April 1, 2020

我有一個 SQL 數據庫,我在其中保存了表中所有日期的數據。我想要的是,如果給定任何兩個日期,我希望這兩個日期之間的所有數據都採用每週格式,每週從星期一開始。例如,如果給定日期從星期四開始,則從星期四到星期日的數據應顯示為一周數據。

我舉一個例子。如果我選擇開始日期 08-01-2020 和結束日期 08-03-2020。現在這是兩個月的差距,大概有30天。我想要這 30 天的數據,但從周一到週日每週都是明智的。但是這裡給定的開始日期是星期三,所以那週的數據將從星期三開始,到星期日結束。

假設我有這張桌子

1   2020-03-15  VDIZHO
2   2020-03-14  MV2XSS
3   2020-03-13  U6Y5OT
4   2020-03-12  C7V6ZJ
5   2020-03-11  LDQ44E
6   2020-03-10  9KY4Z3
7   2020-03-09  NWS6LU
8   2020-03-08  WBD0OB
9   2020-03-07  DMQ7WX
10  2020-03-06  BME2UO
11  2020-03-05  SOXW67
12  2020-03-04  MKJ4B3
13  2020-03-03  VDN9Z3
14  2020-03-02  130VGA
15  2020-03-01  7DDUQC
16  2020-02-29  DNUDGD
17  2020-02-28  CCC7H0
18  2020-02-27  UPO42A
19  2020-02-26  L9QEU6
20  2020-02-25  608W1F
21  2020-02-24  OE24W1
22  2020-02-23  Z8XW75
23  2020-02-22  43G5A7
24  2020-02-21  NXOZRV
25  2020-02-20  ZXRVD7
26  2020-02-19  CGP9E9
27  2020-02-18  12U1L2
28  2020-02-17  MOUTYM
29  2020-02-16  8H50CS
30  2020-02-15  FIREGUN

如果選擇從 2020-02-15 到 2020-03-15 的日期,我想要這樣的數據……

第 1 週:(週從周一到週日開始,這裡的一周從周六開始,到週日結束)

29  2020-02-16  8H50CS
30  2020-02-15  FIREGUN

第 2 週:(週一至週日)

22  2020-02-23  Z8XW75
23  2020-02-22  43G5A7
24  2020-02-21  NXOZRV
25  2020-02-20  ZXRVD7
26  2020-02-19  CGP9E9
27  2020-02-18  12U1L2
28  2020-02-17  MOUTYM

第 3 週:

15  2020-03-01  7DDUQC
16  2020-02-29  DNUDGD
17  2020-02-28  CCC7H0
18  2020-02-27  UPO42A
19  2020-02-26  L9QEU6
20  2020-02-25  608W1F
21  2020-02-24  OE24W1

等等。希望你明白我的意思。

MySQL:

從某個基數(TO_DAYS())開始一天,添加一個軟糖因子(5星期一)以獲得您想要的開始日期。然後除以 7(每週天數)等。現在你有week_num你可以的了GROUP BY

為簡單起見,我使用 MariaDB 的“序列表”來輕鬆生成日期。但這與問題無關。

我特別選擇了年底的一個範圍,因為在嘗試使用標準函式時“週數”很混亂。

SELECT  dy day_num,
       DATE_FORMAT(FROM_DAYS(dy), "%a %Y-%m-%d") the_date, 
       7 * FLOOR((dy + 5) / 7)  AS week_num,
       FROM_DAYS(7 * FLOOR((dy + 5) / 7) - 5) wk_start
   FROM ( SELECT TO_DAYS('2019-12-20') + seq AS dy
              FROM seq_0_to_21 ) AS x;

+---------+----------------+----------+------------+
| day_num | the_date       | week_num | wk_start   |
+---------+----------------+----------+------------+
|  737778 | Fri 2019-12-20 |   737779 | 2019-12-16 |
|  737779 | Sat 2019-12-21 |   737779 | 2019-12-16 |
|  737780 | Sun 2019-12-22 |   737779 | 2019-12-16 |
|  737781 | Mon 2019-12-23 |   737786 | 2019-12-23 |
|  737782 | Tue 2019-12-24 |   737786 | 2019-12-23 |
|  737783 | Wed 2019-12-25 |   737786 | 2019-12-23 |
|  737784 | Thu 2019-12-26 |   737786 | 2019-12-23 |
|  737785 | Fri 2019-12-27 |   737786 | 2019-12-23 |
|  737786 | Sat 2019-12-28 |   737786 | 2019-12-23 |
|  737787 | Sun 2019-12-29 |   737786 | 2019-12-23 |
|  737788 | Mon 2019-12-30 |   737793 | 2019-12-30 |
|  737789 | Tue 2019-12-31 |   737793 | 2019-12-30 |
|  737790 | Wed 2020-01-01 |   737793 | 2019-12-30 |
|  737791 | Thu 2020-01-02 |   737793 | 2019-12-30 |
|  737792 | Fri 2020-01-03 |   737793 | 2019-12-30 |
|  737793 | Sat 2020-01-04 |   737793 | 2019-12-30 |
|  737794 | Sun 2020-01-05 |   737793 | 2019-12-30 |
|  737795 | Mon 2020-01-06 |   737800 | 2020-01-06 |
|  737796 | Tue 2020-01-07 |   737800 | 2020-01-06 |
|  737797 | Wed 2020-01-08 |   737800 | 2020-01-06 |
|  737798 | Thu 2020-01-09 |   737800 | 2020-01-06 |
|  737799 | Fri 2020-01-10 |   737800 | 2020-01-06 |
+---------+----------------+----------+------------+
22 rows in set (0.00 sec)

試試這個,

create table #temp(id int,dates date,col1 varchar(30))
insert into #temp 
values
(1   ,'2020-03-15',' VDIZHO')
,(2   ,'2020-03-14',' MV2XSS')
,(3   ,'2020-03-13',' U6Y5OT')
,(4   ,'2020-03-12',' C7V6ZJ')
,(5   ,'2020-03-11',' LDQ44E')
,(6   ,'2020-03-10',' 9KY4Z3')
,(7   ,'2020-03-09',' NWS6LU')
,(8   ,'2020-03-08',' WBD0OB')
,(9   ,'2020-03-07',' DMQ7WX')
,(10  ,'2020-03-06',' BME2UO')
,(11  ,'2020-03-05',' SOXW67')
,(12  ,'2020-03-04',' MKJ4B3')
,(13  ,'2020-03-03',' VDN9Z3')
,(14  ,'2020-03-02',' 130VGA')
,(15  ,'2020-03-01',' 7DDUQC')
,(16  ,'2020-02-29',' DNUDGD')
,(17  ,'2020-02-28',' CCC7H0')
,(18  ,'2020-02-27',' UPO42A')
,(19  ,'2020-02-26',' L9QEU6')
,(20  ,'2020-02-25',' 608W1F')
,(21  ,'2020-02-24',' OE24W1')
,(22  ,'2020-02-23',' Z8XW75')
,(23  ,'2020-02-22',' 43G5A7')
,(24  ,'2020-02-21',' NXOZRV')
,(25  ,'2020-02-20',' ZXRVD7')
,(26  ,'2020-02-19',' CGP9E9')
,(27  ,'2020-02-18',' 12U1L2')
,(28  ,'2020-02-17',' MOUTYM')
,(29  ,'2020-02-16',' 8H50CS')
,(30  ,'2020-02-15',' FIREGU')

declare @SysDefault int= @@DATEFIRST -- first get ur system default datedifrt

set datefirst 1 -- tune here
;With CTE as
(
select *,DATEPART(wk,dates)weeknum 

from #temp
)
select * from CTE

set datefirst @SysDefault  -- after getting desire result reset 

drop table #temp

新編輯:,

包含 1 月 1 日的樣本數據,

create table #temp(id int,dates date,col1 varchar(30))
insert into #temp 
values
(1   ,'2020-01-15',' VDIZHO')
,(2   ,'2020-01-14',' MV2XSS')
,(3   ,'2020-01-13',' U6Y5OT')
,(4   ,'2020-01-12',' C7V6ZJ')
,(5   ,'2020-01-11',' LDQ44E')
,(6   ,'2020-01-10',' 9KY4Z3')
,(7   ,'2020-01-09',' NWS6LU')
,(8   ,'2020-01-08',' WBD0OB')
,(9   ,'2020-01-07',' DMQ7WX')
,(10  ,'2020-01-06',' BME2UO')
,(11  ,'2020-01-05',' SOXW67')
,(12  ,'2020-01-04',' MKJ4B3')
,(13  ,'2020-01-03',' VDN9Z3')
,(14  ,'2020-01-02',' 130VGA')
,(15  ,'2020-01-01',' 7DDUQC')
,(16  ,'2020-02-29',' DNUDGD')
,(17  ,'2020-02-28',' CCC7H0')
,(18  ,'2020-02-27',' UPO42A')
,(19  ,'2020-02-26',' L9QEU6')
,(20  ,'2020-02-25',' 608W1F')
,(21  ,'2020-02-24',' OE24W1')
,(22  ,'2020-02-23',' Z8XW75')
,(23  ,'2020-02-22',' 43G5A7')
,(24  ,'2020-02-21',' NXOZRV')
,(25  ,'2020-02-20',' ZXRVD7')
,(26  ,'2020-02-19',' CGP9E9')
,(27  ,'2020-02-18',' 12U1L2')
,(28  ,'2020-02-17',' MOUTYM')
,(29  ,'2020-02-16',' 8H50CS')
,(30  ,'2020-02-15',' FIREGU')

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