[英]compare current year and month to database entered y/m within sql query
[英]SQL convert string 3M to 3 month, 1Y to 1 year
幾年前我可能做出了一個糟糕的決定,我一直將間隔存儲在 char(3) 列中,其值為“1M”或“3M”或“1Y”。 這有助於我存儲有關定期發票的信息。 “1M”表示發票每 1 個月更新一次。
這是數據庫的示例: https://i.imgur.com/D8oKaV3.png
這種糟糕設計的原因是因為我通過 php function 計算下一個發票日期:
function increment_date($date, $increment)
{
$new_date = new DateTime($date);
$new_date->add(new DateInterval('P' . $increment));
return $new_date->format('Y-m-d');
}
這樣我就可以通過它 arguments 例如“P1M”這實際上對於DateInterval
非常方便
我現在希望我將它們存儲為“1 個月”而不是“1M”,因為在嘗試運行以下動態 SQL 請求時我被卡住了:
SELECT SUM(invoice_total) prevision_for_current_month
FROM lf_invoice_amounts a
JOIN lf_invoices_recurring r
ON r.invoice_id a.invoice_id
WHERE (month(recur_next_date) = 5 and year(recur_next_date)= 2020)
OR (month(recur_next_date - INTERVAL recur_frequency) = 5 and year(recur_next_date - INTERVAL recur_frequency) = 2020)
帶有month(recur_next_date - INTERVAL recur_frequency)
的部分失敗並拋出錯誤,因為它運行諸如month(recur_next_date - INTERVAL 1M)
之類的mySQL 不理解,而以下內容本來是正確的: month(recur_next_date - INTERVAL 1 month)
此 sql 請求的目的是根據每月/3 個月/每年/2 周/等重復的發票估算當月應收到的所有款項
目前我無法重構整個代碼庫。 什么是可能的解決方法?
TL;DR:如何將包含值“1M”的列轉換為“1 個月”,以便可以間隔運行 SQL 請求。 (“3M”或“1Y”或“1M”或“2W”或“30D”或“31D”等相同)。 丑陋的解決方案也受歡迎。 我目前正在考慮一個大的replace()
巢,可能像month(recur_next_date - INTERVAL replace(recur_frequency, 'M', ' month'))
?
不幸的是,將您的recur_frequency
轉換為像1 month
這樣的字符串並沒有幫助,因為間隔的語法要求該unit
是YEAR
、 MONTH
、 DAY
等之一。即一組固定的說明符之一,而不是字符串,所以嘗試使用INTERVAL recur_frequency
甚至INTERVAL recur_frequency recur_period
的東西都行不通。 在不使用動態 SQL 將recur_frequency
的值插入查詢的情況下,我認為您最好的選擇可能是將重復頻率存儲到 4 列之一(例如recur_year, recur_month, recur_week, recur_day
),然后您可以使用查詢,例如
curdate() - interval recur_year year
- interval recur_month month
- interval recur_week week
- interval recur_day day
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.