2013-07-15 81 views
5

問題選擇記錄,其中日期時間超過指定日期更大

我想從表中獲取所有記錄,其中DATE_TIME場比「星期四,2013年7月11日」更大的通過運行下面提到的查詢。 date_time字段中的值存儲在這個format => Thu,2013年7月11日08:29:37。任何幫助都會很棒。

數據類型字段DATE_TIME的是VARCHAR

查詢

SELECT * FROM table_name 
WHERE username = '[email protected]' 
AND STR_TO_DATE(date_time, '%a, %e %b %Y %H:%i:%s') >= 'Thu, 11 Jul 2013 00:00:00'; 
+0

請覈實DATE_TIME的數據類型。它是varchar還是日期? –

+0

datatype is varchar – colourtheweb

+2

您需要將字符串轉換爲日期,而不是日期轉換爲字符串。 – Barranka

回答

5

您試圖將日期與字符串進行比較。

功能應用程序str_to_date是正確的,但你沒有比較日期。

做正確的做法是:

select * from yourTable 
where STR_TO_DATE(date_time, '%a, %e %b %Y %H:%i:%s') >= '2013-07-11 00:00:00' 

注意,日期格式爲YYYY-MM-DD HH:MM:SS(這是MySQL的默認日期格式)。

當然,你也可以比較str_to_date結果:

... where STR_TO_DATE(date_time, '%a, %e %b %Y %H:%i:%s') >= STR_TO_DATE('Thu, 11 Jul 2013 00:00:00', '%a, %e %b %Y %H:%i:%s') 
+0

我想你在第二個查詢中有一個額外的'where'?如果不是,請解釋語法。 – 2013-07-15 17:16:16

+0

@ebyrob謝謝......只是一個錯字 – Barranka

6

這又是爲什麼你應該使用實現MySQL的日期/時間字段的另一個很好的例子,日期,日期時間,或時間戳記字段類型,並讓您的應用程序處理如何格式化輸出日期。

現在你將需要做的是這樣的:

SELECT * FROM table_name 
WHERE username = '[email protected]' 
AND STR_TO_DATE(date_time, '%a, %e %b %Y %H:%i:%s') >= STR_TO_DATE('Thu, 11 Jul 2013 00:00:00', '%a, %e %b %Y %H:%i:%s'); 

這個查詢將無法使用您有任何指數的date_time場,所以查詢將是非常低效的。它將需要執行全表掃描,轉換每行的值以進行比較。

你應該做的是:

SELECT * FROM table_name 
WHERE username = '[email protected]' 
AND date_time >= STR_TO_DATE('Thu, 11 Jul 2013 00:00:00', '%a, %e %b %Y %H:%i:%s'); 

在這裏,如果你有在MySQL的日期時間格式你的領域,你只需要輸入轉換爲這種格式匹配。由於您的字段數據已經採用此格式,因此您可以利用索引進行搜索。

相關問題