sql查詢日期時間范圍的數量 sql語句查詢日期時間范圍



文章插圖
sql查詢日期時間范圍的數量 sql語句查詢日期時間范圍

文章插圖
問題描述
都知道between and查詢是包含上下邊界的, 但是在遇到
形如
select 字段1, 字段2 from table_xxx where 時間字段 between 開始時間 and 結束時間的日期查詢時, 查詢結果可能會出乎意料.
(注意: 使用的數據庫是MariaDB(MySQL), 時間字段 是 DATETIME 類型)
比如: select 字段1, 字段2 from table_xxx where 時間字段 between ‘2021-05-01’ and ‘2021-05-10’ 的查詢結果中,
包含2021-05-01的記錄, 但并不包含2021-05-10最后一天的記錄,
好像between and的邊界原則失效了, 這是這么回事呢?
問題解答
實際上, between and的查詢邊界并沒有改變, 還是老樣子, 只是我們在日期查詢時, 一開始把問題想簡單了, 實際上還是對于字段類型把握的準確性.
【sql查詢日期時間范圍的數量 sql語句查詢日期時間范圍】由于時間字段是DATETIME類型, 我們來仔細看看DATETIME數據類型:
DATETIMEA date and time combination. MariaDB displays DATETIME values in 'YYYY-MM-DD HH:MM:SS.ffffff' format, but allows assignment of values to DATETIME columns using either strings or numbers.MariaDB stores values that use the DATETIME data type in a format that supports values between 1000-01-01 00:00:00.000000 and 9999-12-31 23:59:59.999999.以上對DATETIME的描述摘自:https://mariadb.com/kb/en/datetime/ 頁面
由此可知, 語句between ‘2021-05-01’ and ‘2021-05-10’
會被MariaDB數據庫轉換為
between ‘2021-05-01 00:00:00.000000’ and ‘2021-05-10 00:00:00.000000’.
這樣當然不會包含05-10這一天的記錄.
所以, 問題還是出在 查詢條件 寫得不夠嚴謹, 不要偷懶, 寫成下面語句
between ‘2021-05-01 00:00:00’ and ‘2021-05-10 23:59:59’
就能達到我們想要得目標結果了, 如果數據很多, 時間顆粒度要求高, 也可寫成
between ‘2021-05-01 00:00:00.000000’ and ‘2021-05-10 23:59:59.999999’
就完美了!