Към съдържанието
wannacode

Функции за дати

Накратко: В SQLite датите са текст от вида 2026-10-25, а date, strftime и julianday добавят дни, извличат годината и месеца и смятат дните между две дати.

Проблем

До кога мога да я върна?

Клиент пише: „До кога мога да върна поръчката си?“ Магазинът дава 30 дни от датата на поръчката. Днес е 25 октомври 2026 г.

Да броиш дни по календара е бавно, а в края на месеца се греши често. Нека го направи базата.

Идеята

Дата плюс дни

В магазина датите са текст във вида година-месец-ден: 2026-10-25. Това е международният стандарт (ISO 8601). Затова досега датите се подреждаха и сравняваха правилно.

Функцията date(дата, промяна) прави сметки с дати:

SQLбаза: магазин

Поръчка 54 може да се върне до днес включително. Промените могат да са дни, месеци и години, напред или назад, а 'start of month' дава първия ден на месеца:

SQLбаза: магазин
По-точно, за любопитните

Тези функции са строги към вида на датата. Без водещата нула (2026-9-30) date дава NULL, а сравнението като текст лъже: '2026-10-25' излиза преди '2026-9-30', защото „1“ е преди „9“. А '+1 month' от 31 януари прави 31 февруари, тоест 3 март:

SQLбаза: магазин

Затова датите се пазят винаги с водещи нули, а при месеците се внимава в края на месеца.

Пробвай

Срокът за плащане

Новите поръчки (new) трябва да се платят до 3 дни след поръчката. Покажи номера, датата и крайния срок в колона pay_until.

SQLбаза: магазин

Идеята

Година, месец, ден

strftime(вид, дата) вади част от датата: '%Y' е годината, '%m' месецът, '%d' денят, '%w' денят от седмицата (0 е неделя, 6 е събота).

SQLбаза: магазин

Резултатът е текст, и то с водеща нула: месецът е 03, а не 3.

Виж го

Регистрираните през март

Маркетингът иска клиентите, регистрирани през март, в която и да е година. Пусни:

SQLбаза: магазин
1. Защо WHERE strftime('%m', joined_at) = 3 не намира никого?

Със същия вид, текст с водеща нула, излизат двама:

SQLбаза: магазин

Идеята

Колко дни между две дати

julianday(дата) превръща датата в число: колко дни са минали от една много стара начална дата. Самото число не ти трябва, но разликата на две такива числа е броят дни между датите.

Колко дни са в магазина продуктите за кухнята:

SQLбаза: магазин
По-точно, за любопитните

В истински отчет вместо '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, най-дълго чакащата първа.

SQLбаза: магазин

Упражнение

Две задачи

1. Куриерът не работи в неделя. Кои поръчки са направени в неделя? Покажи номера и датата.

Поръчките, направени в неделя:

SQLбаза: магазин

2. Кои доставени поръчки още може да се върнат днес, 25 октомври 2026 г.? Покажи номера, датата и срока за връщане в колона return_until.

Доставените поръчки, които още може да се върнат:

SQLбаза: магазин

Тест

Провери се

1. Какво дава date('2026-10-25', '+7 days')?
2. Колко дни дава julianday('2026-10-25') - julianday('2026-10-01')?
3. Кое условие намира клиентите, регистрирани през 2025 г.?
4. Защо в уроците пишем '2026-10-25', а не date('now')?

Създаден от Иво Гергов като част от кампанията на Evo Tech за достъпно обучение по програмиране ·