Функции за дати
Накратко: В SQLite датите са текст от вида 2026-10-25, а date, strftime и julianday добавят дни, извличат годината и месеца и смятат дните между две дати.
Проблем
До кога мога да я върна?
Клиент пише: „До кога мога да върна поръчката си?“ Магазинът дава 30 дни от датата на поръчката. Днес е 25 октомври 2026 г.
Да броиш дни по календара е бавно, а в края на месеца се греши често. Нека го направи базата.
Идеята
Дата плюс дни
В магазина датите са текст във вида година-месец-ден: 2026-10-25. Това е международният стандарт (ISO 8601). Затова досега датите се подреждаха и сравняваха правилно.
Функцията date(дата, промяна) прави сметки с дати:
Поръчка 54 може да се върне до днес включително. Промените могат да са дни, месеци и години, напред или назад, а 'start of month' дава първия ден на месеца:
По-точно, за любопитните
Тези функции са строги към вида на датата. Без водещата нула (2026-9-30) date дава NULL, а сравнението като текст лъже: '2026-10-25' излиза преди '2026-9-30', защото „1“ е преди „9“. А '+1 month' от 31 януари прави 31 февруари, тоест 3 март:
Затова датите се пазят винаги с водещи нули, а при месеците се внимава в края на месеца.
Пробвай
Срокът за плащане
Новите поръчки (new) трябва да се платят до 3 дни след поръчката. Покажи номера, датата и крайния срок в колона pay_until.
Решение
SELECT id, ordered_at, date(ordered_at, '+3 days') AS pay_until FROM orders WHERE status = 'new';date(ordered_at, '+3 days') AS pay_until. Тук проверката гледа и имената на колоните.
Идеята
Година, месец, ден
strftime(вид, дата) вади част от датата: '%Y' е годината, '%m' месецът, '%d' денят, '%w' денят от седмицата (0 е неделя, 6 е събота).
Резултатът е текст, и то с водеща нула: месецът е 03, а не 3.
Виж го
Регистрираните през март
Маркетингът иска клиентите, регистрирани през март, в която и да е година. Пусни:
Със същия вид, текст с водеща нула, излизат двама:
Идеята
Колко дни между две дати
julianday(дата) превръща датата в число: колко дни са минали от една много стара начална дата. Самото число не ти трябва, но разликата на две такива числа е броят дни между датите.
Колко дни са в магазина продуктите за кухнята:
По-точно, за любопитните
В истински отчет вместо '2026-10-25' ще напишеш date('now') или CURRENT_DATE: днешната дата. В SQLite и двете са по UTC, а не по българско време, затова в първите два-три часа след полунощ българската дата вече е следващата, а на базата още не е. В уроците пишем фиксирана дата, за да е резултатът един и същ всеки ден.
Ако датата има и час (2026-10-25 18:20:00), datetime и time работят по същия начин като date, а julianday дава и част от деня: 12 часа са 0,5.
Пробвай
Платените, които чакат
Платените поръчки (paid) още не са изпратени. Колко дни чака всяка до 25 октомври 2026 г.? Покажи номера, датата и дните в колона waiting, най-дълго чакащата първа.
Решение
SELECT id, ordered_at, julianday('2026-10-25') - julianday(ordered_at) AS waiting
FROM orders
WHERE status = 'paid'
ORDER BY waiting DESC;julianday('2026-10-25') - julianday(ordered_at) AS waiting и ORDER BY waiting DESC. Поръчка 9 чака от октомври 2025 г.: някой е забравил за нея. Тук проверката гледа и реда.
Упражнение
Две задачи
1. Куриерът не работи в неделя. Кои поръчки са направени в неделя? Покажи номера и датата.
Поръчките, направени в неделя:
Решение
SELECT id, ordered_at FROM orders WHERE strftime('%w', ordered_at) = '0';WHERE strftime('%w', ordered_at) = '0'. Пак текст: '0' в кавички. Седем поръчки.
2. Кои доставени поръчки още може да се върнат днес, 25 октомври 2026 г.? Покажи номера, датата и срока за връщане в колона return_until.
Доставените поръчки, които още може да се върнат:
Решение
SELECT id, ordered_at, date(ordered_at, '+30 days') AS return_until
FROM orders
WHERE status = 'delivered' AND date(ordered_at, '+30 days') >= '2026-10-25';WHERE status = 'delivered' AND date(ordered_at, '+30 days') >= '2026-10-25'. Две поръчки, 54 и 56. За 54 днес е последният ден, затова е >=, а не >.
Тест
Провери се
Свързани уроци
Раздел „Свързани уроци“- Нужно отпреди: SELECT: избор на колони · WHERE: филтриране на редове · ORDER BY, LIMIT и DISTINCT · Сметки в заявката
- Продължава в: GROUP BY: отчет по групи · HAVING: условие за групите · Редът на изпълнение на заявката · Дървета и редици: WITH RECURSIVE
- Задачи по темата: Изрази и функции