Встроенные функции, даты и CAST

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

Встроенная функция вычисляет значение из своих аргументов прямо в запросе — для каждой строки.

Строковые функции

SQLite умеет обрабатывать текст прямо в SQL. Самые ходовые функции: LENGTH (длина), SUBSTR (подстрока), REPLACE (замена), TRIM (убрать пробелы по краям), UPPER/LOWER (регистр — для латиницы).

CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT);

INSERT INTO users (name) VALUES ('  Аня  '), ('Борис');

SELECT '[' || TRIM(name) || ']' AS trimmed,
       LENGTH(TRIM(name))        AS len,
       SUBSTR(TRIM(name), 1, 1)  AS first_letter
FROM users;

Вывод:

[Аня]|3|А
[Борис]|5|Б

TRIM убрал пробелы вокруг «Аня», LENGTH посчитал символы, SUBSTR(s, 1, 1) взял первую букву. Учтите: UPPER/LOWER в стандартном SQLite меняют регистр только у латинских букв, кириллицу они не трогают.

Даты — это текст или число

Отдельного типа даты нет, но есть функции для работы с датами-строками формата ГГГГ-ММ-ДД ЧЧ:ММ:СС: date(), time(), datetime() и мощная strftime() для произвольного формата.

CREATE TABLE events (id INTEGER PRIMARY KEY, name TEXT, dt TEXT);

INSERT INTO events (name, dt) VALUES
    ('Старт',  '2024-03-15 10:30:00'),
    ('Финиш',  '2024-12-31 23:59:00');

SELECT name,
       date(dt)             AS только_дата,
       strftime('%Y', dt)   AS год,
       strftime('%H:%M', dt) AS время
FROM events;

Вывод:

Старт|2024-03-15|2024|10:30
Финиш|2024-12-31|2024|23:59

А разницу между датами в днях даёт функция julianday(): julianday('2024-03-20') - julianday('2024-03-15') вернёт 5.0. Текущее время можно получить через datetime('now').

CAST — явное приведение типа

Иногда нужно явно превратить значение в другой тип. Это делает CAST(значение AS тип). Например, строку в число или число в текст:

SELECT CAST('42' AS INTEGER) + 8   AS chislo,
       CAST(3.9 AS INTEGER)        AS otbroshen_drobnyy,
       typeof(CAST(5 AS TEXT))     AS tip;

Вывод:

50|3|text

Строка '42' стала числом и сложилась с 8. CAST(3.9 AS INTEGER) отбросил дробную часть (получилось 3, без округления). А CAST(5 AS TEXT) превратил число в строку — typeof это подтверждает.

Итог

  • Строковые функции: LENGTH, SUBSTR, REPLACE, TRIM, UPPER/LOWER (регистр — только латиница).
  • Даты хранят как текст; обрабатывают функциями date(), strftime(), julianday().
  • CAST(значение AS тип) явно приводит значение к нужному типу.
Проверьте себя
1. Что вернёт SUBSTR(TRIM(' Аня '), 1, 1)?
A' Аня '
B'Аня'
C'А'
Dпробел
2. Как в SQLite обычно получают год из даты-строки?
AYEAR(dt)
Bstrftime('%Y', dt)
CEXTRACT(YEAR FROM dt)
Ddt.year
3. Что делает CAST(3.9 AS INTEGER)?
AОкругляет до 4
BОтбрасывает дробную часть, получая 3
CВозвращает ошибку
DВозвращает '3.9' как текст
Поддержать проект