mysql 時間類型 between and 的邊界問題


先看例子,有如下數據,3個字段分別對應的數據類型為,time_datetime是datetime類型,time_date是date類型,time_timestamp是timestamp類型:

mysql> SELECT * FROM time_type_demo;
+----+---------------------+------------+---------------------+
| id | time_datetime       | time_date  | time_timestamp      |
+----+---------------------+------------+---------------------+
|  1 | 2020-08-10 23:09:29 | 2020-08-10 | 2020-08-10 23:09:45 |
|  2 | 2020-08-17 23:09:58 | 2020-08-17 | 2020-08-17 23:10:06 |
+----+---------------------+------------+---------------------+
2 rows in set

進行between and查詢如下:

mysql> SELECT id,time_datetime FROM time_type_demo WHERE time_datetime BETWEEN '2020-08-10' AND '2020-08-17';

SELECT id,time_date FROM time_type_demo WHERE time_date BETWEEN '2020-08-10' AND '2020-08-17';

SELECT id,time_timestamp FROM time_type_demo WHERE time_timestamp BETWEEN '2020-08-10' AND '2020-08-17';
+----+---------------------+
| id | time_datetime       |
+----+---------------------+
|  1 | 2020-08-10 23:09:29 |
+----+---------------------+
1 row in set

+----+------------+
| id | time_date  |
+----+------------+
|  1 | 2020-08-10 |
|  2 | 2020-08-17 |
+----+------------+
2 rows in set

+----+---------------------+
| id | time_timestamp      |
+----+---------------------+
|  1 | 2020-08-10 23:09:45 |
+----+---------------------+
1 row in set

從結果可以看出,datetime和timestamp類型的字段進行between and查詢時是不包括右邊界的,date類型的包含右邊界。首先明確這個結論,在應用時務必注意。

原因是什么呢?

因為MySQL對日期的查詢是默認“00:00:00”,所以上面的區間實際為:2020-08-10 00:00:00——2020-08-17 00:00:00,2020-08-17 23:09:58是不在這個區間內的,所以查詢不到。(嚴格來說不是不包括右邊界,而是右邊界為 00:00:00,一般時間都不在這個范圍內,如果有時間為00:00:00那也包括。

而date類型的字段是沒有時分秒的,所以date類型是包括右邊界的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM