Mysql
從星期四或一周中的任何其他日子開始,如何通過每週結果改進我的 SQL 語句?
我是一個完全的新手,我在任何地方都找不到這樣做的好方法。我有一個數據庫表,其中包含一周內不同時間記錄的統計資訊。報告週從星期四開始。該表包含一個日期戳列(日期),用於儲存記錄數據的時間。
我需要提取給定一周的數據(報告週從星期四開始)。我寫了以下查詢:
SELECT * FROM `table` WHERE 1 = CASE WHEN WEEKDAY(NOW()) = 0 THEN DATEDIFF(NOW(),`date`) BETWEEN -2 AND 4 WHEN WEEKDAY(NOW()) = 1 THEN DATEDIFF(NOW(),`date`) BETWEEN -1 AND 5 WHEN WEEKDAY(NOW()) = 2 THEN DATEDIFF(NOW(),`date`) BETWEEN -0 AND 6 WHEN WEEKDAY(NOW()) = 3 THEN DATEDIFF(NOW(),`date`) BETWEEN -6 AND 0 WHEN WEEKDAY(NOW()) = 4 THEN DATEDIFF(NOW(),`date`) BETWEEN -5 AND 1 WHEN WEEKDAY(NOW()) = 5 THEN DATEDIFF(NOW(),`date`) BETWEEN -4 AND 2 WHEN WEEKDAY(NOW()) = 6 THEN DATEDIFF(NOW(),`date`) BETWEEN -3 AND 3 END
這似乎適用於初始測試。但我不確定這是最好的方法。我對 MySQL 的性能了解不多,但是會有超過十萬條記錄需要過濾。由於檢查的條件數量,這個查詢真的很慢嗎?
NOW() 函式在提取最新報告時使用 - 但是,在某些情況下,我需要在其他幾週內進行報告 - 所以我會在該位置替換另一個日期。
此外,如果報告週發生更改,則以這種方式執行此操作需要重新編寫查詢 - 例如開始日更改為星期三。
我不能使用 WEEK() 函式,因為你只能在周日或週一用它開始一周。
非常感謝任何改進此查詢的想法!
其他說明:目前使用 MariaDB 5.3。
這是我寫的一個查詢,給你最近的星期四和結束的星期三
SELECT thuwk_beg + INTERVAL 0 second thu_beg, thuwk_beg + INTERVAL 604799 second wed_end FROM (SELECT (DATE(NOW()) - INTERVAL daysbacktothursday DAY) thuwk_beg FROM (SELECT SUBSTR('3456012',wkndx,1) daysbacktothursday FROM (SELECT DAYOFWEEK(dt) wkndx FROM (SELECT DATE(NOW()) dt) AAAA) AAA) AA) A;
這是今天的一個例子,2011-09-21
mysql> SELECT -> thuwk_beg + INTERVAL 0 second thu_beg, -> thuwk_beg + INTERVAL 604799 second wed_end -> FROM (SELECT (DATE(NOW()) - INTERVAL daysbacktothursday DAY) thuwk_beg -> FROM (SELECT SUBSTR('3456012',wkndx,1) daysbacktothursday -> FROM (SELECT DAYOFWEEK(dt) wkndx FROM (SELECT DATE(NOW()) dt) AAAA) AAA) AA) A; +---------------------+---------------------+ | thu_beg | wed_end | +---------------------+---------------------+ | 2011-09-15 00:00:00 | 2011-09-21 23:59:59 | +---------------------+---------------------+ 1 row in set (0.00 sec)
只需將 NOW() 函式呼叫替換為您喜歡的任何日期時間,您將擁有從星期四開始的一周,以便您選擇給定的日期時間。
這是使用特定日期“2011-01-01”的另一個範例
mysql> SELECT -> thuwk_beg + INTERVAL 0 second thu_beg, -> thuwk_beg + INTERVAL 604799 second wed_end -> FROM (SELECT (DATE('2011-01-01') - INTERVAL daysbacktothursday DAY) thuwk_beg -> FROM (SELECT SUBSTR('3456012',wkndx,1) daysbacktothursday -> FROM (SELECT DAYOFWEEK(dt) wkndx FROM (SELECT DATE('2011-01-01') dt) AAAA) AAA) AA) A; +---------------------+---------------------+ | thu_beg | wed_end | +---------------------+---------------------+ | 2010-12-30 00:00:00 | 2011-01-05 23:59:59 | +---------------------+---------------------+ 1 row in set (0.00 sec)
您
table
今天的引用查詢類似於以下內容:SELECT * from `table`, (SELECT thuwk_beg + INTERVAL 0 second thu_beg, thuwk_beg + INTERVAL 604799 second wed_end FROM (SELECT (DATE(NOW()) - INTERVAL daysbacktothursday DAY) thuwk_beg FROM (SELECT SUBSTR('3456012',wkndx,1) daysbacktothursday FROM (SELECT DAYOFWEEK(dt) wkndx FROM (SELECT DATE(NOW()) dt) AAAA) AAA) AA) A) M WHERE `date` >= thu_beg AND `date` <= wed_end;
試一試 !!!
更新 2011-09-22 16:27 EDT
這是我提出的標記周四至週三的查詢。
SELECT thuwk_beg + INTERVAL 0 second thu_beg, thuwk_beg + INTERVAL 604799 second wed_end FROM (SELECT (DATE(NOW()) - INTERVAL daysbacktothursday DAY) thuwk_beg FROM (SELECT SUBSTR('3456012',wkndx,1) daysbacktothursday FROM (SELECT DAYOFWEEK(dt) wkndx FROM (SELECT DATE(NOW()) dt) AAAA) AAA) AA) A;
其他周呢???
(SELECT SUBSTR('6012345',wkndx,1)
從周一到週日的那一周(SELECT SUBSTR('5601234',wkndx,1)
從周二開始到週一結束的那一周(SELECT SUBSTR('4560123',wkndx,1)
從周三開始到週二結束的那一周(SELECT SUBSTR('3456012',wkndx,1)
從周四開始到週三結束的那一周(SELECT SUBSTR('2345601',wkndx,1)
從周五開始到週四結束的那一周(SELECT SUBSTR('1234560',wkndx,1)
從周六開始到週五結束的那一周(SELECT SUBSTR('0123456',wkndx,1)
從周日開始到週六結束的那一周