Работа с датами
Даты в Pixel Shop — это тексты вида 'YYYY-MM-DD'. В SQLite нет особого типа для дат, но есть функции, которые понимают такие тексты и умеют с ними считать.
strftime(format, date) (от «string format time», «записать время в виде строки») записывает дату в другом виде. Формат — это текст, в котором %Y означает год, %m — месяц, а %d — день; всё остальное копируется как есть:
SELECT title, released,
strftime('%Y', released) AS year,
strftime('%m/%d/%Y', released) AS us_date
FROM games
LIMIT 3;| title | released | year | us_date |
|---|---|---|---|
| Dragon Forge | 2024-03-14 | 2024 | 03/14/2024 |
| Pixel Racer | 2023-07-02 | 2023 | 07/02/2023 |
| Moon Farm | 2022-11-18 | 2022 | 11/18/2022 |
Результат strftime — всегда текст, даже если он выглядит как число: год — это '2024', а не 2024. Почему это важно, вы увидите дальше в этом уроке. Следите за заглавными буквами в формате: %M — это не месяц, а минуты, которые в дате без времени равны 00.
date(date, modifier) сдвигает дату. Модификатор — это текст вроде '+7 days', '-1 month' или '+1 year', а результат — снова дата в обычном виде:
SELECT date('2024-03-14', '+7 days') AS week_later,
date('2024-03-14', '-1 month') AS month_before,
date('2024-03-14', 'start of month') AS first_day;| week_later | month_before | first_day |
|---|---|---|
| 2024-03-21 | 2024-02-14 | 2024-03-01 |
date знает, сколько дней в каждом месяце, включая високосные годы: через неделю после 2024-02-25 будет 2024-03-03. Можно указать несколько модификаторов, и они применяются по порядку: date(released, 'start of month', '+1 month', '-1 day') — последний день месяца, в котором вышла игра. Одно предостережение: через месяц после 31 января было бы 31 февраля, которого не существует, поэтому SQLite переходит на март: date('2024-01-31', '+1 month') — это 2024-03-02.
Функции для дат обычно пишут строчными буквами, как в документации SQLite; как и названия любых функций, они работают и заглавными. Особая дата — 'now': date('now') — сегодняшняя дата, а date('now', '+30 days') — дата через 30 дней. Настоящие приложения используют это постоянно, но в этих упражнениях её нет, потому что результат меняется каждый день.
Типичная ошибка: формат или модификатор без кавычек. strftime(%Y, released) завершается ошибкой near "%": syntax error. Форматы и модификаторы — это тексты, поэтому они пишутся в одинарных кавычках.
Задание
- 1
Для ежемесячного отчёта о продажах покажите ID и дату каждого заказа, а также его месяц в виде
2024-01какmonth. Отсортируйте заказы по ID:id ordered_at month 1 2024-01-20 2024-01 2 2024-02-14 2024-02 3 2024-02-29 2024-02 … … … - 2
Клиенты могут вернуть игру в течение 14 дней. Ниже покажите ID и дату каждого заказа и последний день для возврата, через 14 дней после заказа, как
refund_until. Отсортируйте заказы по ID:id ordered_at refund_until 1 2024-01-20 2024-02-03 2 2024-02-14 2024-02-28 3 2024-02-29 2024-03-14 … … … - 3
Новые клиенты получают приветственную скидку на месяц. Ещё ниже покажите имя и дату регистрации каждого клиента, а также дату через месяц как
discount_until. Отсортируйте клиентов по дате регистрации:name joined discount_until Emma Clark 2023-01-15 2023-02-15 Liam Turner 2023-02-03 2023-03-03 Olivia Brown 2023-04-21 2023-05-21 … … …