問題描述
都知道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的查詢邊界並沒有改變, 還是老樣子, 只是我們在日期查詢時, 一開始把問題想簡單了, 實際上還是對於欄位類型把握的準確性.
由於時間欄位是DATETIME類型, 我們來仔細看看DATETIME數據類型:
DATETIME
A 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’
就完美了!
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/228126.html