Mysql
在數據集中創建列以供以後過濾器使用(mysql)
我有一個日期列(格式:14.05.2018)和銷售計數。我想創建一個額外的列,從目前日期角度標記距離今天 +/-6 天的欄位。下面的查詢不太好用,列是空的
select `Date`, `Sales`, (CASE when DAY(CURRENT_DATE())-6 <= DAY(`Date`) AND DAY(CURRENT_DATE())-6 >= DAY(`Date`) then '1' when DAY(CURRENT_DATE())-6 > DAY(`Date`) AND DAY(CURRENT_DATE())-6 < DAY(`Date`) then '0' end as Flag) from sales;
數據應該以文本或 ddl 形式發布,這讓我們所有人的生活更輕鬆
基本上你的查詢可以簡化為一個 If 子句,如下所示,但是當我再次測試它時,我注意到,mysql 不喜歡你的日期格式,所以它必須轉換為日期,這樣程式碼才能正常工作.
架構(MySQL v5.6)
CREATE TABLE sales ( `Date` VARCHAR(10), `Sales` INTEGER ); INSERT INTO sales (`Date`, `Sales`) VALUES ('14.05.2018', '8046'), ('11.02.2020', '4564'), ('25.07.2018', '6648'), ('25.08.2020', '7785'), ('01.09.2020', '8788'), ('30.04.2018', '4655'), ('22.09.2019', '6867'), ('09.12.2016', '6868'), ('26.10.2018', '6785'), ('01.09.2020', '7456'), ('12.12.2018', '7456');
查詢 #1
select `Date`, `Sales`, IF(CURRENT_DATE() - INTERVAL 6 DAY <= STR_TO_DATE(`Date`,'%d.%c.%Y') AND CURRENT_DATE() + INTERVAL 6 DAY >= STR_TO_DATE(`Date`,'%d.%c.%Y'),1,0) flag from sales; | Date | Sales | flag | | ---------- | ----- | ---- | | 14.05.2018 | 8046 | 0 | | 11.02.2020 | 4564 | 0 | | 25.07.2018 | 6648 | 0 | | 25.08.2020 | 7785 | 0 | | 01.09.2020 | 8788 | 1 | | 30.04.2018 | 4655 | 0 | | 22.09.2019 | 6867 | 0 | | 09.12.2016 | 6868 | 0 | | 26.10.2018 | 6785 | 0 | | 01.09.2020 | 7456 | 1 | | 12.12.2018 | 7456 | 0 |
我有一個日期列(格式:14.05.2018)…
我建議不要。
日期 沒有格式。
無論如何,你或我不需要擔心。交給 IEEE 工程師吧。
您有一個Char列,恰好包含一些您或我會解釋為Date的文本。正如您所發現的,在不是Dates的東西上做“日期”的東西是非常困難的(而且很慢) 。所有這些對 str_to_date 的呼叫意味著您的查詢將進行表掃描,因為它不知道任何更好的方法來計算您要過濾的值。使用正確的數據類型使您的查詢更易於閱讀,並允許數據庫在這些欄位上使用索引(更快!)
select `Date`, `Sales`, IF ( CURRENT_DATE() - INTERVAL 6 DAY <= STR_TO_DATE(`Date`,'%d.%c.%Y') AND CURRENT_DATE() + INTERVAL 6 DAY >= STR_TO_DATE(`Date`,'%d.%c.%Y') , 1, 0 ) flag from sales;
變成
select `Date`, `Sales`, IF ( CURRENT_DATE() - INTERVAL 6 DAY <= `Date` AND CURRENT_DATE() + INTERVAL 6 DAY >= `Date` , 1, 0 ) flag from sales;
或者,甚至可能(未經測試):
select `Date`, `Sales`, IF ( `Date` BETWEEN CURRENT_DATE() - INTERVAL 6 DAY AND CURRENT_DATE() + INTERVAL 6 DAY , 1, 0 ) flag from sales;
並不是說您應該將其
Date
用作欄位名稱 -始終避免使用保留字作為標識符。你幾乎可以保證你會遇到一些讓你絆倒的情況。我想創建一個額外的列,從目前日期角度標記距離今天 +/-6 天的欄位。
不要儲存可以(並且應該)派生的數據。如果將此“標誌”儲存為欄位,則必須每天更新每條記錄以反映日曆的變化。
如果您有幸擁有支持虛擬列(5.7+)的 MySQL 版本,請使用其中一個來“即時”計算值,或者,如果失敗,則創建一個視圖來解決它。