簡體   English   中英

SQL 將字符串 3M 轉換為 3 個月,1Y 轉換為 1 年

[英]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這樣的字符串並沒有幫助,因為間隔的語法要求該unitYEARMONTHDAY等之一。即一組固定的說明符之一,而不是字符串,所以嘗試使用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

dbfiddle 上的演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM