Дни между датами
Сколько дней между двумя датами? Вычитание не работает, причём даже не выдаёт ошибку:
SELECT '2024-01-20' - '2023-01-15' AS days;| days |
|---|
| 1 |
Даты — это тексты, и когда SQLite должен посчитать что-то с текстом, он берёт число в его начале, а остальное игнорирует. Так что это 2024 - 2023, то есть 1. Даты сначала нужно превратить в числа, и это делает julianday(date): она возвращает количество дней, прошедших с одного давнего дня (24 ноября 4714 года до н. э., который астрономы считают днём 0). Само число неинтересно, но разница двух таких чисел — это количество дней между датами:
SELECT julianday('2024-01-20') AS first_order,
julianday('2023-01-15') AS joined,
julianday('2024-01-20') - julianday('2023-01-15') AS days;| first_order | joined | days |
|---|---|---|
| 2460329.5 | 2459959.5 | 370.0 |
Emma Clark сделала первый заказ через 370 дней после регистрации. (.5 здесь потому, что у астрономов день начинается в полдень; в разнице оно сокращается.)
Разница — десятичное число, 370.0, потому что julianday считает и часы: julianday('2024-01-20 18:00') больше на три четверти дня. Чтобы получить целое число, преобразуйте его с помощью CAST(x AS INTEGER). CAST преобразует значение в другой тип: INTEGER, REAL или TEXT. В целое число оно превращается отбрасыванием десятичной части, как при делении нацело: CAST(3.9 AS INTEGER) равно 3. Даты без времени всегда отличаются на целое число дней, так что ничего не теряется. Сколько дней каждый клиент был с магазином в Новый год 2025 года?
SELECT name, joined,
CAST(julianday('2025-01-01') - julianday(joined) AS INTEGER) AS days
FROM customers
LIMIT 3;| name | joined | days |
|---|---|---|
| Emma Clark | 2023-01-15 | 717 |
| Liam Turner | 2023-02-03 | 698 |
| Olivia Brown | 2023-04-21 | 621 |
Можно было бы использовать ROUND вместо CAST, но тогда получится 717.0. А когда дни — целое число, деление нацело даёт целые недели: 717 / 7 равно 102.
Для NULL функция julianday возвращает NULL, как и другие функции, так что у игры, которая ещё не вышла, нет числа дней с момента выхода. А julianday('now') — это прямо сейчас, поэтому julianday('now') - julianday(joined) показывает, сколько клиент уже с магазином сегодня, и это число растёт каждый день.
Типичная ошибка: даты в обратном порядке. julianday(joined) - julianday('2025-01-01') для Emma Clark даёт -717.0. Всегда вычитайте раннюю дату из поздней.
Задание
- 1
Сколько дней каждая игра была в продаже в Новый год 2026 (
'2026-01-01')? Покажите название, дату выхода и количество дней какdays_outцелым числом (48, а не48.0). Отсортируйте игры по дате выхода от самой новой:title released days_out Knight's Oath 2025-11-14 48 Goal Rush 2025-09-26 97 Turbo Karts 2025-06-05 210 … … … - 2
Ниже покажите, за сколько дней до Рождества (24 декабря 2025 года,
'2025-12-24') были сделаны заказы ноября и декабря 2025 года: ID, дату иdays_to_christmasцелым числом. Отсортируйте заказы по дате:id ordered_at days_to_christmas 26 2025-11-14 40 27 2025-11-20 34 28 2025-11-28 26 29 2025-12-12 12 30 2025-12-22 2