Mysql

在數據集中創建列以供以後過濾器使用(mysql)

  • September 4, 2020

我有一個日期列(格式: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    |

在 DB Fiddle 上查看

我有一個日期列(格式: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 版本,請使用其中一個來“即時”計算值,或者,如果失敗,則創建一個視圖來解決它。

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