MySQL中 BETWEEN ... AND ...

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');

image-20211213113135543

2. 如果列是date類型,則 BETWEEN ... AND ... 包含左右區間

如:篩選 生日爲2021-02-012021-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'

結果均爲:

image-20211213113227611

3. 如果列是datetime類型,則需分情況討論

3.1 如果傳入的參數格式爲datetime格式,則仍包含左右區間

如:篩選 create_time2021-02-21 的所有數據,即2021-02-01 00:00:002021-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'

結果均爲:

image-20211214093933622

3.2 如果傳入的格式是date格式,此時需要注意一些邊界情況

如:需求同上,篩選 create_time2021-02-21 的所有數據,但不指定時分秒:

SELECT * FROM student WHERE create_time BETWEEN '2021-02-01' AND '2021-02-01'

image-20211214093959502

顯然數據有誤,只查出來 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 的數據的情況


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章