MySQL中 BETWEEN ... AND ...
阿新 • • 發佈:2021-12-14
MySQL中 BETWEEN ... AND ...
1. 準備測試資料
CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `age` int(11) NOT NULL, `create_time` datetime DEFAULT NULL, `birthday` date DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB EFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO `test`.`student`(`id`, `name`, `age`, `create_time`, `birthday`) VALUES (1, 'Andy', 10, '2021-02-01 00:00:00', '2021-01-30'), (2, 'Ben', 18, '2021-02-01 00:00:01', '2021-01-31'), (3, 'Cindy', 18, '2021-02-01 12:01:54', '2021-02-01'), (4, 'David', 18, '2021-02-01 23:59:59', '2021-02-02'), (5, 'Cindy2', 18, '2021-02-02 00:00:00', '2021-02-03'), (6, 'Cindy3', 19, '2021-02-02 00:00:01', '2021-02-28'), (7, 'Cindy4', 19, '2021-11-22 12:19:33', '2021-02-28');
2. 如果列是date
型別,則 BETWEEN ... AND ...
包含左右區間
如:篩選 生日為2021-02-01
到 2021-02-02
的學生
寫法1:SELECT * FROM student WHERE birthday BETWEEN '2021-02-01' AND '2021-02-02'
寫法2:SELECT * FROM student WHERE birthday >= '2021-02-01' AND birthday <= '2021-02-02'
結果均為:
3. 如果列是datetime
型別,則需分情況討論
3.1 如果傳入的引數格式為datetime
格式,則仍包含左右區間
如:篩選 create_time
為2021-02-21
的所有資料,即2021-02-01 00:00:00
至 2021-02-01 23:59:59
寫法1:SELECT * FROM student WHERE create_time BETWEEN '2021-02-01 00:00:00' AND '2021-02-01 23:59:59'
寫法2:SELECT * FROM student WHERE create_time >= '2021-02-01 00:00:00' AND create_time <= '2021-02-01 23:59:59'
結果均為:
3.2 如果傳入的格式是date
格式,此時需要注意一些邊界情況
如:需求同上,篩選 create_time
為2021-02-21
的所有資料,但不指定時分秒:
SELECT * FROM student WHERE create_time BETWEEN '2021-02-01' AND '2021-02-01'
顯然資料有誤,只查出來 2021-02-01 00:00:00
的資料,出現這種現象的原因,就是因為如果針對datetime
列的欄位做篩選,但輸入的值卻是date
型別的話,預設會自動追加00:00:00
因此,上一句SQL實際上會被自動轉成如下格式:
SELECT * FROM student WHERE create_time BETWEEN '2021-02-01 00:00:00' AND '2021-02-01 00:00:00'
這才出現了只查詢到2021-02-01 00:00:00
的資料的情況