2017-07-16 108 views
-2

我有一個巨大的數據,日期爲字符串。mysql日期比較無法正常工作無法找到問題

列名date1

數據類型varchar

存儲的數據的格式如下:年3月14-2016現在下午5點44分38秒

我從這個字符串分割僅日期像這樣:14-03-2016

通過使用這個:DATE_FORMAT(STR_TO_DATE(gr.date1, '%d-%M-%Y'),'%d-%m-%Y')

現在我想比較與此查詢日期:

SELECT * FROM 
(SELECT date1,DATE_FORMAT(STR_TO_DATE(date1, '%d-%M-%Y'),'%d-%m-%Y') as dateFormatted 
FROM `grabt`) as mTbl WHERE mTbl.dateFormatted >= '19-01-2016' 
AND mTbl.dateFormatted <= '25-01-2016' 

,但它不工作,這可能是可能的錯誤?

回答

1

可以使用STR_TO_DATE()連同格式字符串%d-%b-%Y %r將時間戳字符串14-Mar-2016 05:44:38pm轉換爲日期時間。然後我們可以通過用DATE()包裝來獲得日期部分。看看這裏for a demo to see that this works

SELECT * 
FROM 
(
    SELECT DATE(STR_TO_DATE(date1, '%d-%b-%Y %r')) AS dateFormatted 
    FROM grabt 
) AS mTbl 
WHERE mTbl.dateFormatted BETWEEN '2016-01-19' AND '2016-01-25' 

正如Gordon已經指出的,理想情況下,您應該使用日期類型而不是字符串進行日期計算。順便說一下,在WHERE條款中比較時使用有效的日期字符串。 YYYY-MM-DD是一個有效的格式,例如2016-01-19,但19-01-2016不是。

1

學習使用正確的色譜柱類型。也許你堅持把別人的日期/時間作爲字符串存儲的決定是非常糟糕的。也許你不能改變這一點。但是,在查詢中,使用正確的類型!

SELECT mTbl.*, 
     LEFT(date1, 10) as FormattedDate -- Is this really necessary? 
FROM (SELECT date1, 
      STR_TO_DATE(LEFT(date1, 10), '%d-%M-%Y') as thedate 
     FROM `grabt` 
    ) mTbl 
WHERE mTbl.thedate >= '2016-01-19' AND 
     mTbl.thedate <= '2016-01-25'; 

這將做比較,因爲日期不是字符串

+0

不'thedate'可能在'%d,%M'中存在問題,現在實際上結果爲零 –