Mysql
搜尋日期查詢不起作用?
我正在嘗試使用日期查詢最近一周的行。但是查詢沒有返回任何結果。執行需要很長時間。
我檢查了我的數據庫,其中日期以
1446976737
似乎是 unix 時間戳的格式保存。但是在我的過濾器中,使用者正在輸入人類可讀的日期,例如2018-11-11
. 現在通過執行以下查詢,我沒有得到結果。我的查詢有什麼問題嗎?SELECT `e`.`id` AS `id`, `e`.`first_name` AS `first_name`, `e`.`gender` AS `gender`, `e`.`email` AS `email`, `e`.`phone` AS `phone`, `e`.`age` AS `age`, `e`.`version` AS `version`, `e`.`evaluation_status` AS `evaluation_status`, `e`.`ip_address` AS `ip_address`, `e`.`date_created` AS `date_created`, `e`.`date_updated` AS `date_updated` FROM `evaluation_client` AS `e` WHERE AND `e`.`date_created` >= 2018-11-11 AND `e`.`date_created` <= 2018-11-18;
從答案和評論中,我也嘗試了以下查詢,但仍然需要 3 分鐘才能載入數據是否正常?我怎樣才能讓它更快?
SELECT `e`.`id` AS `id`, `e`.`first_name` AS `first_name`, `e`.`gender` AS `gender`, `e`.`email` AS `email`, `e`.`phone` AS `phone`, `e`.`age` AS `age`, `e`.`version` AS `version`, `e`.`evaluation_status` AS `evaluation_status`, `e`.`ip_address` AS `ip_address`, `e`.`date_created` AS `date_created`, `e`.`date_updated` AS `date_updated` FROM `evaluation_client` AS `e` WHERE `e`.`date_created` >= unix_timestamp("2015-11-11") AND `e`.`date_created` <= unix_timestamp("2015-11-19") ORDER BY `e`.`date_created` DESC;
(這就是我們要求數據類型的原因
date_created
!)假設
date_created
是TIMESTAMP
:
2018-11-11
是一個算術表達式,計算結果為1996
; 當然不是你想要的。
"2018-11-11"
(帶引號)將與 1446976737 正確比較。
UNIX_TIMESTAMP(ts_column)
會生成類似的東西1446976737
,所以它應該可以正常工作。但不要“隱藏函式中的列”。至於
`e`.`date_created` AS `date_created`
由於別名 (AS…) 沒有做任何額外的事情,所以不要使用它。我很擔心
AND `e`.`date_created`
將查看別名,而不是值。它需要查看使用它的值:
INDEX(date_created)
你有那個索引嗎?
通過使用
>=
,<=
您從兩端包括午夜;你打算這樣做嗎?
WHERE AND
語法不正確。你有沒有遺漏一些東西?這可能很重要。如果你有WHERE x = 1 AND date_created ...
那麼更好的索引將是
INDEX(x, date_created)
1446976737
可以追溯到幾年前:mysql> SELECT FROM_UNIXTIME(1446976737), UNIX_TIMESTAMP("2018-11-11"); +---------------------------+------------------------------+ | FROM_UNIXTIME(1446976737) | UNIX_TIMESTAMP("2018-11-11") | +---------------------------+------------------------------+ | 2015-11-08 01:58:57 | 1541923200 | +---------------------------+------------------------------+
當你不知道該怎麼做時,這裡有一個提示:看看你能從
SELECT * FROM tbl
. 然後在該格式的內容周圍加上引號。在TIMESTAMP
列的情況下,你會得到類似的東西2015-11-08 01:58:57
所以,你需要
date_created = "2015-11-08 01:58:57"
假設
date_created
是INT
:其中任何一個都是比較的有效方法:
date_created >= 1446976737 date_created >= UNIX_TIMESTAMP("2015-11-08 01:58:57")
擁有上述索引仍然有效且明智。