我的桌子上有一個DATETIME列,用於存儲創建記錄的時間。我只想選擇在特定日期創建的記錄。如果我嘗試:如何僅使用日期從DATETIME列中進行選擇?
SELECT *
FROM myTable
WHERE postedOn = '2012-06-06'
它不返回行,即使有與postedOn
集表中的許多行作爲 2012-06-06 21:42:02
,2012-06-06 07:55:17
,等等。
任何想法?
我的桌子上有一個DATETIME列,用於存儲創建記錄的時間。我只想選擇在特定日期創建的記錄。如果我嘗試:如何僅使用日期從DATETIME列中進行選擇?
SELECT *
FROM myTable
WHERE postedOn = '2012-06-06'
它不返回行,即使有與postedOn
集表中的許多行作爲 2012-06-06 21:42:02
,2012-06-06 07:55:17
,等等。
任何想法?
使用DATE標:
SELECT *
FROM myTable
WHERE date(postedOn) = '2012-06-06'
如果有很多記錄,這可能會使查詢變慢嗎? –
否。更糟糕的是:保留兩個字段,一個是日期,另一個是時間。 –
@tony在維護方面更糟,但性能如何? –
SELECT *
FROM myTable
WHERE DATE(postedOn) = '2012-06-06'
DATE()返回日期時間字段的日期部分。
http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date
加入了一天的日期創建一個時間段:
SELECT *
FROM myTable
WHERE postedOn >= '2012-06-06' and postedOn < '2012-06-07'
這是最有效的方式,因爲查詢可以在該字段上使用索引。
需要做第二次查詢來做這個SELECT DATE_ADD($ oldDate,interval 1 day)'或者計算第二天的日期的等價物,所以與使用'date() ' –
@ClickUpvote:計算下一個日期只進行一次,然後可以直接將該值與索引進行比較。使用date()意味着它必須使用表掃描來計算表中每個值的日期值。 – Guffa
你原來的代碼不會工作的原因是因爲沒有日期等於'2012-06-06 00:00:00',使用Date(),如其他人所建議的那樣,這些值將刪除時間信息並作出比較返回結果。 – ToddBFisher
你總是可以用這個技巧截斷'datetime'的時間:'CAST(FLOOR(CAST(some_datetime AS FLOAT))AS DATETIME)' - 我的最愛之一。便於報道日常累積。 – bluevector