Mysql

搜尋日期查詢不起作用?

  • November 20, 2018

我正在嘗試使用日期查詢最近一周的行。但是查詢沒有返回任何結果。執行需要很長時間。

我檢查了我的數據庫,其中日期以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_createdTIMESTAMP

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_createdINT

其中任何一個都是比較的有效方法:

date_created >= 1446976737
date_created >= UNIX_TIMESTAMP("2015-11-08 01:58:57")

擁有上述索引仍然有效且明智。

引用自:https://dba.stackexchange.com/questions/222821