2013-01-02 38 views
0

我有稱爲測試一個MySQL表,該結構代碼如下的MySQL STR_TO_DATE V/S DATE_FORMAT

CREATE TABLE IF NOT EXISTS `test` (
    `id` int(11) NOT NULL, 
    `name` varchar(255) NOT NULL, 
    `assigned_date` date NOT NULL 
) ENGINE=InnoDB 

給出並且該表是由含有以下數據:

INSERT INTO `test` (`id`, `name`, `assigned_date`) VALUES 
(0, 'A', '2012-12-23'), 
(0, 'B', '2012-12-25'); 

現在的問題是當我運行以下查詢它不會返回任何行。

SELECT name 
FROM test 
WHERE 
    DATE_FORMAT(assigned_date, '%m/%d/%Y') >= '12/01/2012' 
    AND 
    DATE_FORMAT(assigned_date, '%m/%d/%Y') <= '01/02/2013' 

但是,當我使用以下命令時,它會返回兩行,如預期。

SELECT name 
FROM test 
WHERE 
    assigned_date >= STR_TO_DATE('12/01/2012', '%m/%d/%Y') 
    AND 
    assigned_date <= STR_TO_DATE('01/02/2013', '%m/%d/%Y') 

有什麼區別?爲什麼DATE_FORMAT沒有工作?

請幫助我使用date_format函數通過一個網站。現在看來我必須更新整個網站。

謝謝。

+0

如果您不確定某個功能,至少在比較中加入一些邏輯。年份將一直增加,月份將每13日重置一次,日期將爲最短1最多31.爲什麼不將它安排爲年|月|日,因此您可以安全地允許查詢自動將其作爲數字進行比較。 –

回答

10

DATE_FORMAT將DATE轉換爲STRING。

STR_TO_DATE將STRING轉換爲日期。

從MySQL文檔

2

,因爲它轉換assigned_date以mm/dd/yyyy格式的字符串,然後該字符串比較DATE_FORMAT沒有工作你的兩個字符串常量 - 並且沒有字符串> =一個字符串開始12和< =一個字符串開始01.

+0

您可以在yyyymmdd中使用DATE_FORMAT(assigned_date,'%Y%m%d')排列字符串,因此最新日期將是最大數字(邏輯上)。例如,在此情況下:DATE_FORMAT(assigned_date,'%Y%m%d')> ='20121201'和DATE_FORMAT(assigned_date,'%Y%m%d')<='20130102' –

+0

@ 4LeaveCover DATE_FORMAT在此處無用;他們可以做'assigned_date> ='2012-12-01'和assigned_date <='2013-01-02'' – ysth

+0

是的,我同意你的看法。但是你會注意到,他把不正確的做法安排在年月裏嗎?這首先造成了他的問題。 –

0

DATE_FORMAT()函數根據格式掩碼指定日期格式。

DATE_FORMAT(date, format_mask) 
Example: 
SELECT DATE_FORMAT("2017-06-15", "%M %d %Y"); 
SELECT DATE_FORMAT(BirthDate, "%W %M %e %Y") FROM Employees; 

的MySQL STR_TO_DATE()返回通過取的字符串,並以特定的格式字符串作爲參數的日期時間值。

STR_TO_DATE(str,format); 
Example: 
SELECT STR_TO_DATE('18,05,2009','%d,%m,%Y'); 
SELECT STR_TO_DATE('May 18, 2009','%M %d,%Y');