Функции даты и времени в SQL
Функции даты и времени в SQLite: strftime, date, julianday — извлечение частей даты, разница между датами, фильтрация по периоду.
В SQLite даты хранятся как текст (
'YYYY-MM-DD') или число. Специальные функции позволяют извлекать части дат, форматировать их и вычислять разницу.
strftime — форматирование даты
strftime(format, date) возвращает дату в нужном формате. Основные спецификаторы:
| Спецификатор | Значение |
%Y | год (4 цифры) |
%m | месяц (01–12) |
%d | день (01–31) |
%H | час (00–23) |
%M | минуты |
-- Год и месяц приёма каждого сотрудника
SELECT
emp_name,
hire_date,
strftime('%Y', hire_date) AS hire_year,
strftime('%m', hire_date) AS hire_month
FROM employees;
Результат:
emp_name | hire_date | hire_year | hire_month -------------+------------+-----------+----------- Ethan Hunt | 2001-05-01 | 2001 | 05 Tony Montana | 2002-07-15 | 2002 | 07 Sarah Connor | 2005-10-18 | 2005 | 10 Rick Deckard | 2007-01-03 | 2007 | 01 Martin Blank | 2008-06-24 | 2008 | 06
date() и 'now'
date('now') возвращает текущую дату. Можно прибавлять или отнимать интервалы:
SELECT
date('now') AS today,
date('now', '+7 days') AS next_week,
date('now', '-1 month') AS prev_month;
Результат (пример):
today | next_week | prev_month -----------+------------+----------- 2026-06-13 | 2026-06-20 | 2026-05-13
Вычисление стажа через julianday
julianday(date) переводит дату в вещественное число дней. Разность двух таких чисел — количество дней между датами:
-- Стаж каждого сотрудника в полных годах
SELECT
emp_name,
hire_date,
CAST((julianday('now') - julianday(hire_date)) / 365.25 AS INTEGER) AS years_worked
FROM employees
ORDER BY years_worked DESC;
Результат (приблизительный):
emp_name | hire_date | years_worked -------------+------------+------------- Ethan Hunt | 2001-05-01 | 25 Tony Montana | 2002-07-15 | 23 Sarah Connor | 2005-10-18 | 20 Rick Deckard | 2007-01-03 | 19 Martin Blank | 2008-06-24 | 17
Фильтрация по году
Найдём сотрудников, принятых после 2005 года:
SELECT emp_name, hire_date
FROM employees
WHERE strftime('%Y', hire_date) > '2005'
ORDER BY hire_date;
Результат:
emp_name | hire_date -------------+------------ Rick Deckard | 2007-01-03 Martin Blank | 2008-06-24
Сравниваем как строки (
'2005'), потому чтоstrftimeвозвращает текст. Это работает для формата%Y, так как строки годов сравниваются лексикографически правильно.
Коротко
strftime('%Y', date)извлекает год;'%m'— месяц,'%d'— день.date('now')— текущая дата; к ней можно прибавлять'+N days','+N months'.juliandayудобен для вычисления разницы между датами в днях.- Фильтрацию по дате часто делают через
strftimeили прямое сравнение строкBETWEEN.
Проверьте себя
1. Как в SQLite получить текущую дату?
ANOW()
BCURRENT_DATE()
Cdate('now')
DTODAY()
2. Что вернёт strftime('%Y', '2025-09-15')?
A"2025-09-15"
B"2025"
C"09"
D"15"
3. Для чего используется julianday?
AДля форматирования даты
BДля перевода даты в число дней и вычисления разниц между датами
CДля получения текущего времени
DДля добавления интервалов к дате