Сравнение дат
В SQLite нет специального типа для дат. Pixel Shop хранит их как текст в виде 'YYYY-MM-DD': год, месяц и день, причём перед однозначными месяцами и днями ставится ноль. 14 марта 2024 года — это '2024-03-14'. Эта форма — международный стандарт (ISO 8601), и её понимают почти все базы данных и языки программирования.
В условии дату пишут как любой другой текст, в одинарных кавычках. Заказы ко Дню святого Валентина 2025 года:
SELECT id, customer_id, ordered_at
FROM orders
WHERE ordered_at = '2025-02-14';| id | customer_id | ordered_at |
|---|---|---|
| 16 | 11 | 2025-02-14 |
Остальные сравнения с датами тоже работают и дают правильные ответы благодаря порядку частей. Текст сравнивается с первого символа, поэтому сначала решает год, потом месяц, потом день — как и с датами. Вы уже видели это на предыдущем уроке, когда ORDER BY сортировал такие даты от самой старой. Более ранняя дата меньше, более поздняя — больше. Заказы начиная с декабря 2025 года:
SELECT id, ordered_at
FROM orders
WHERE ordered_at >= '2025-12-01'
ORDER BY ordered_at;| id | ordered_at |
|---|---|
| 29 | 2025-12-12 |
| 30 | 2025-12-22 |
Чтобы выбрать целый год, запросите даты от 1 января этого года (включительно) до 1 января следующего (не включая). Заказы 2024 года:
SELECT id, ordered_at
FROM orders
WHERE ordered_at >= '2024-01-01'
AND ordered_at < '2025-01-01'
ORDER BY ordered_at;| id | ordered_at |
|---|---|
| 1 | 2024-01-20 |
| 2 | 2024-02-14 |
| 3 | 2024-02-29 |
| … | … |
Почему < '2025-01-01', а не <= '2024-12-31'? С датами, как в магазине, подходят оба варианта. Но в некоторых столбцах есть ещё и время, например '2024-12-31 18:30', и этот текст больше, чем '2024-12-31', поэтому <= пропустил бы вечер новогодней ночи. «Меньше первого дня следующего года» — правильно всегда.
Строки с NULL вместо даты, например Robot Rebellion без даты выхода, не находит ни одно из этих условий. Почему, вы узнаете в последнем упражнении этого урока.
Типичная ошибка: дата без кавычек. WHERE released > 2024-01-01 — не ошибка, но SQLite читает 2024-01-01 как вычисление: 2024 минус 1 минус 1, то есть 2022. Запрос тогда находит игры, выпущенные с 2022 года. Дата в другой форме, например '3/14/2024' или '2024-3-14', тоже не лучше: она сравнивается как текст, символ за символом, и результаты получаются неверными без всяких ошибок.
Задание
- 1
Покажите название и дату выхода игр, вышедших до 2022 года, сначала самые старые:
title released Cube Logic 2020-02-11 Castle Siege 2021-05-20 Ocean Deep 2021-08-30 - 2
Ниже покажите имя и дату регистрации (
joined) покупателей, которые пришли в магазин в 2024 году, отсортировав по дате регистрации:name joined Jack Harris 2024-01-08 Mia Lewis 2024-03-19 Leo Walker 2024-05-27 Isla Young 2024-08-14 Oscar King 2024-11-30