Sql-Server
如何在兩個給定日期之間每週從數據庫中獲取數據?
我有一個 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')