Mysql

從星期四或一周中的任何其他日子開始,如何通過每週結果改進我的 SQL 語句?

  • December 31, 2021

我是一個完全的新手,我在任何地方都找不到這樣做的好方法。我有一個數據庫表,其中包含一周內不同時間記錄的統計資訊。報告週從星期四開始。該表包含一個日期戳列(日期),用於儲存記錄數據的時間。

我需要提取給定一周的數據(報告週從星期四開始)。我寫了以下查詢:

  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)從周日開始到週六結束的那一周

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