2011-02-15 51 views
0

我有一個查詢按日期進行搜索。這裏是WHERE子句:Mysql和日期函數,它是否在每一行上處理它?

WHERE DATE_FORMAT(listing.trackdate,'%Y-%m-%d') >= STR_TO_DATE('$search_sdate','%m/%d/%Y') 

MySQL是否必須爲每行處理date_format和str_to_date以滿足where子句?還是有更好的方法呢?表中的字段是日期時間類型。其MySQL版本5.x. $ search_sdate是從網絡表單收到的日期。

編輯: 澄清我想比較部分日期字段。日期字段類型是存儲日期加上每行插入時間的日期時間。但是對於這個特定的where子句,我只想比較該字段的日期部分。希望能更好地澄清它,對於混淆抱歉。

+0

did you try ??`DATE((STR_TO_DATE(「'。$$ search_sdate。'」,「%Y-%m-%d」))`你想做什麼?比較日期? – diEcho 2011-02-15 21:24:31

回答

0

你在問正確的問題。爲了簡化它,您應該避免包含任何類型的表字段上的任何類型操作的SQL語句。它不僅爲正在考慮的每個記錄添加處理,還會阻止優化器包含任何包含該字段的索引。

如果您想要一個涉及一系列時間(例如日期)的答案,請使用「WHERE datetimefield BETWEEN(午夜和午夜)」 - 或更準確地說,「WHERE datetimefield> =午夜和datetimefield < nextmidnight」。

0

你不能執行沒有格式化函數的WHERE子句嗎?爲了處理比較,MySQL不需要格式化它。您的格式只能在SELECT

1

如果listing.trackdate一個DATE場的事,爲什麼它需要的格式與其他日期比較?看起來您正在獲取日期值並將其轉換爲字符串,以便您可以將其與您轉換爲日期的字符串值進行比較。

我希望這種方法的冗餘性應該是顯而易見的。

至於你問的第一個問題,當然DATE_FORMAT(listing.trackdate)必須爲每一行進行評估,因爲該字段中的值將會改變。但似乎

WHERE listing.trackdate >= STR_TO_DATE('$search_sdate','%m/%d/%Y') 

應該足夠了,如果trackdate,着實日期字段。

+0

是的,他可能甚至不需要格式化字符串mySql應該爲他做...我知道sql服務器將會 – 2011-02-15 21:18:13

+0

@Nicklamort我同意,但是我對MySQL的行爲不夠熟悉,我的回答。:) – 2011-02-15 21:20:24

相關問題