Mysql

如何選擇具有日期頻率 的過期行?

  • January 7, 2022
+------------------------+--------+
|  Invoice_id | due_date | amount |
+-------------+----------+--------+
|  20         |2020-01-18|  1250  |
+-------------+----------+--------+
| 21          |2020-01-15|  1335  |
+-------------+----------+--------+

獲取所有已通過日期的記錄,n days and its multiple serires 如下所示…

例如 n=5

SELECT * FROM `invoices` 
WHERE `due_date = DATE_ADD(CURDATE() + INTERVAL 5 days)
OR due_date = DATE_ADD(CURDATE() + INTERVAL 10 days)
OR due_date = DATE_ADD(CURDATE() + INTERVAL 15 days)`

但我想讓它對任何人都通用n value

**注意:*我機器中的 mySQL 版本是 5.

WITH RECURSIVE
cte AS 
( SELECT @starting_deviation num
 UNION ALL
 SELECT num + @delta_deviation
 FROM cte 
 WHERE num < @final_deviation )
SELECT * 
FROM invoices
JOIN cte ON invoices.due_date = CURRENT_DATE + INTERVAL cte.num DAY

對於來自 question@starting_deviation := 5@delta_deviation := 5的查詢@final_deviation := 15。這些值可以按字面意思指定(立即插入查詢而不是變數),通過變數值賦值傳輸或從某個服務表中獲取。


在 MySQL 5+ 中,您必須在子查詢中生成 numbers 表或使用外部靜態 numbers 表。

SELECT * 
FROM invoices
JOIN ( SELECT 5 num UNION ALL
      SELECT 10 UNION ALL
      SELECT 15 ) cte ON invoices.due_date = CURRENT_DATE + INTERVAL cte.num DAY

我要補充的是我的頻率不高達 3 系列。它可以超過 3,也可以是任何數字….例如,如果 n 為 5,並且我想要 10 個頻率,則意味著 5,10,15,20……, 50

使用數字生成器。例如它可以是(顯示的生成器最多可以給出 64 個值):

SELECT * 
FROM invoices
JOIN ( SELECT 5 * (1 + t1.num + t2.num * 4 + t3.num + 16) num
      FROM (SELECT 0 num UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3) t1,
           (SELECT 0 num UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3) t2,
           (SELECT 0 num UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3) t3
    ) cte ON  invoices.due_date = CURRENT_DATE + INTERVAL cte.num DAY
WHERE cte.num BETWEEN 1 AND 10;
WHERE (DATEDIFF(due_date, CURDATE) % 5) = 0

將過濾到今天和今天之前或之後 5 天的任何倍數。將其用作其餘查詢的基本建構塊。

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