2017-04-14 25 views
0

您好我都存儲在MySQL表以下值:發現如果一個日期使用的日期範圍的MySQL

--- ------------------------  ------------------- 
Id | StartDate (VARCHAR (20)) | EndDate(VARCHAR(20)) 
--- ------------------------  ------------------- 
1 | 03-04-2017    | 18-04-2017 

我使用下面的SQL以發現日期爲起始日期和結束日期內:

SELECT 
(date_format(str_to_date('03-04-2017','%d-%m-%Y'),'%d-%m-%Y') >= StartDate 
AND 
date_format(str_to_date('03-04-2017','%d-%m-%Y'),'%d-%m-%Y') <= EndDate) AS 
valid 
FROM holiday 

我的問題是,當我執行查詢並提供03-04-2017它返回1,但也返回1當我提供03-05-2017。

有人可以請突出顯示這個查詢中有什麼問題嗎?

+0

什麼數據類型有字段? VARCHAR還是DATE? –

+0

@BerndBuffen謝謝他們都varchar和不幸的是我不能改變架構。 – snowflakes74

+0

你需要將字符串轉換爲日期 –

回答

2

使用這樣的查詢:

SELECT * 
FROM holiday 
WHERE 
    STR_TO_DATE(StartDate,'%d-%m-%Y') 
BETWEEN 
    str_to_date('03-04-2017','%d-%m-%Y') 
AND 
    str_to_date('03-04-2017','%d-%m-%Y'); 

樣品

mysql> SELECT IF(STR_TO_DATE('11-04-2017','%d-%m-%Y') 
    ->    BETWEEN 
    ->     str_to_date('03-04-2017','%d-%m-%Y') 
    ->    AND 
    ->     str_to_date('10-04-2017','%d-%m-%Y') 
    -> 
    -> ,'YES','NO') AS ANSWER; 
+--------+ 
| ANSWER | 
+--------+ 
| NO  | 
+--------+ 
1 row in set (0,00 sec) 

mysql> SELECT IF(STR_TO_DATE('04-04-2017','%d-%m-%Y') 
    ->    BETWEEN 
    ->     str_to_date('03-04-2017','%d-%m-%Y') 
    ->    AND 
    ->     str_to_date('10-04-2017','%d-%m-%Y') 
    -> 
    -> ,'YES','NO') AS ANSWER; 
+--------+ 
| ANSWER | 
+--------+ 
| YES | 
+--------+ 
1 row in set (0,01 sec) 

mysql> 
+0

謝謝,但我需要找到「給定」日期是在「StartDate」和「EndDate」之間。您的解決方案在這些日期之間返回記錄例如,如果日期爲04-04-2017,則返回Yes;如果日期爲19-04-2017,則返回No,因爲它不在StartDate和EndDate之間。 – snowflakes74

+0

我在我的答案中添加了一個示例,因此您只需將其放在字段 –

+0

完美且工作良好。謝謝 – snowflakes74

1

您可以使用BETWEEN運營商比較的日期,例如:

SELECT * 
FROM `table` 
WHERE '2017-04-03' BETWEEN start_date AND end_date; 

更新

如果日期存儲爲varchar那麼你需要在比較之前將其轉換爲date,例如:

SELECT * 
FROM table 
WHERE '2017-04-03' BETWEEN STR_TO_DATE(start_date, '%d-%m-%Y') AND STR_TO_DATE(end_date, '%d-%m-%Y'); 

這是SQL Fiddle

+0

它存儲爲字符串,而不是你使用的格式 –

+0

@juergend注意到發佈答案後問題的更新。現在變得僵硬。 –

1

其他所有的答案都好你的問題,但在我看來,你應該轉換數據庫。

只有理智的選擇。

使用日期奇怪的VARCHAR格式將來會有很大的影響。這不僅會影響你的表的性能,還會因爲它而錯過整個MySQL日期API生態系統。

  1. 添加臨時列假設tmp_start_time DATE
  2. ,補之以日期UPDATE holiday SET tmp_start_time = str_to_date(start_time,'%d-%m-%Y')
  3. 刪除舊的varchar鍵表
  4. 添加相同的密鑰,但作爲DATE
  5. 更新他們UPDATE holiday SET start_time = tmp_start_time

從現在開始,你將可以使用BETWEEN爲其他人沒有STR_TO_DATE


我剛剛找到您的評論

不幸的是我無法改變的模式

問自己兩次:你確定嗎?

+0

感謝您的建議,我同意100%,但在我的情況下,我繼承了此應用程序,並且我正在接受指示,不要更改架構,因爲它可能會破壞某些報告。 – snowflakes74

+0

@ snowflakes74噢主我很抱歉:(祝你好運 – Peter