Функции даты и времени в 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Для добавления интервалов к дате
Поддержать проект