⌛ Основы по работе с датами в SQL. Часть 2/3
Привет, продолжаем разбор основ начатый в предыдущем посте. Там мы разобрали:
➖ Основные типы данных для хранения дат.
➖ Функции получения текущего времени.
➖ Извлечение отдельных компонентов даты и времени.
Для инфо синтаксис в коде постов пишу для PostgreSQL (как популярной промышленной СУБД, для других логика похожа, но синтаксис может отличаться, гуглите)
⌛ Арифметика с датами: работа с интервалами
SQL позволяет выполнять математические операции с датами — добавлять/вычитать дни, месяцы, годы и другие временные интервалы.
-- Предположим, у нас есть дата: '2024-03-15 14:30:25'
SELECT
created_at, -- Исходная дата: 2024-03-15 14:30:25
-- Добавляем 7 дней (также можно и с месяцами - '2 months')
-- Результат: 2024-03-22 14:30:25
created_at + INTERVAL '7 days' AS one_week_later,
-- Вычитаем 3 дня
-- Результат: 2024-03-12 14:30:25
created_at - INTERVAL '3 days' AS three_days_ago,
-- Добавляем 1 год
-- Результат: 2025-03-15 14:30:25
created_at + INTERVAL '1 year' AS next_year,
-- Добавляем 3 часа
-- Результат: 2024-03-15 17:30:25
created_at + INTERVAL '3 hours' AS three_hours_later,
-- Добавляем 30 минут
-- Результат: 2024-03-15 15:00:25
created_at + INTERVAL '30 minutes' AS thirty_minutes_later,
-- Комбинируем интервалы
-- Результат: 2025-04-22 17:45:25 (через 1 год, 1 месяц, 7 дней, 3 часа, 15 минут)
created_at + INTERVAL '1 year' + INTERVAL '1 month' + INTERVAL '7 days' +
INTERVAL '3 hours' + INTERVAL '15 minutes' AS complex_interval
FROM orders
WHERE id = 123;
⌛ Вычисление разницы между датами
Часто нужно узнать, сколько времени прошло между двумя событиями — для этого есть специальные функции.
-- Считаем разницу между двумя конкретными датами в днях
-- Результат: 7 (разница в днях между 15 марта и 22 марта)
SELECT '2024-03-22'::date - '2024-03-15'::date AS days_difference;
-- Считаем разницу между датой заказа и текущей датой
SELECT
created_at, -- Дата создания заказа
-- Текущая дата
CURRENT_DATE,
-- Сколько дней прошло с момента создания заказа
-- Если результат отрицательный - заказ из будущего
-- Если положительный - сколько дней прошло
CURRENT_DATE - created_at::date AS days_since_order,
-- Альтернативный способ: сколько дней до будущей даты
'2024-12-31'::date - CURRENT_DATE AS days_until_new_year
FROM orders
WHERE id = 123;
⌛ Форматирование дат для отображения
Иногда нужно представить дату в определённом формате — для отчётов, пользовательского интерфейса и т.д.
-- Исходная дата: '2024-03-15 14:30:25'
-- Хотим получить различные форматы отображения
SELECT
created_at, -- Исходное значение: 2024-03-15 14:30:25
-- Форматируем как: 15.03.2024
-- DD = день (01-31), MM = месяц (01-12), YYYY = год (4 цифры)
TO_CHAR(created_at, 'DD.MM.YYYY') AS formatted_date_1,
-- Форматируем как: 15/03/24 (день/месяц/год 2 цифры)
-- YY = год (2 цифры)
TO_CHAR(created_at, 'DD/MM/YY') AS formatted_date_2,
-- Форматируем как: 15 марта 2024
-- Month = полное название месяца
TO_CHAR(created_at, 'DD Month YYYY') AS formatted_date_3,
-- Форматируем как: Friday, 15 March 2024
-- Day = полное название дня недели, Month = полное название месяца
TO_CHAR(created_at, 'Day, DD Month YYYY') AS formatted_date_4,
-- Форматируем как: 2024-03-15 (ISO формат)
TO_CHAR(created_at, 'YYYY-MM-DD') AS iso_date,
-- Форматируем время как: 14:30
-- HH24 = час (00-23), MI = минуты (00-59)
TO_CHAR(created_at, 'HH24:MI') AS time_only,
-- Форматируем как: 15.03.2024 14:30
TO_CHAR(created_at, 'DD.MM.YYYY HH24:MI') AS datetime_formatted
FROM orders
WHERE id = 123;
В следующем посте и заключительном по основам, разберем пару реальных задач и я дам несколько полезных советов по работе в этой области.
#SQL
📱 Подписаться на канал
💻 Курс автора по SQL DDL
🌎 Мой ИТ-стартап
Привет, продолжаем разбор основ начатый в предыдущем посте. Там мы разобрали:
➖ Основные типы данных для хранения дат.
➖ Функции получения текущего времени.
➖ Извлечение отдельных компонентов даты и времени.
Для инфо синтаксис в коде постов пишу для PostgreSQL (как популярной промышленной СУБД, для других логика похожа, но синтаксис может отличаться, гуглите)
⌛ Арифметика с датами: работа с интервалами
SQL позволяет выполнять математические операции с датами — добавлять/вычитать дни, месяцы, годы и другие временные интервалы.
-- Предположим, у нас есть дата: '2024-03-15 14:30:25'
SELECT
created_at, -- Исходная дата: 2024-03-15 14:30:25
-- Добавляем 7 дней (также можно и с месяцами - '2 months')
-- Результат: 2024-03-22 14:30:25
created_at + INTERVAL '7 days' AS one_week_later,
-- Вычитаем 3 дня
-- Результат: 2024-03-12 14:30:25
created_at - INTERVAL '3 days' AS three_days_ago,
-- Добавляем 1 год
-- Результат: 2025-03-15 14:30:25
created_at + INTERVAL '1 year' AS next_year,
-- Добавляем 3 часа
-- Результат: 2024-03-15 17:30:25
created_at + INTERVAL '3 hours' AS three_hours_later,
-- Добавляем 30 минут
-- Результат: 2024-03-15 15:00:25
created_at + INTERVAL '30 minutes' AS thirty_minutes_later,
-- Комбинируем интервалы
-- Результат: 2025-04-22 17:45:25 (через 1 год, 1 месяц, 7 дней, 3 часа, 15 минут)
created_at + INTERVAL '1 year' + INTERVAL '1 month' + INTERVAL '7 days' +
INTERVAL '3 hours' + INTERVAL '15 minutes' AS complex_interval
FROM orders
WHERE id = 123;
⌛ Вычисление разницы между датами
Часто нужно узнать, сколько времени прошло между двумя событиями — для этого есть специальные функции.
-- Считаем разницу между двумя конкретными датами в днях
-- Результат: 7 (разница в днях между 15 марта и 22 марта)
SELECT '2024-03-22'::date - '2024-03-15'::date AS days_difference;
-- Считаем разницу между датой заказа и текущей датой
SELECT
created_at, -- Дата создания заказа
-- Текущая дата
CURRENT_DATE,
-- Сколько дней прошло с момента создания заказа
-- Если результат отрицательный - заказ из будущего
-- Если положительный - сколько дней прошло
CURRENT_DATE - created_at::date AS days_since_order,
-- Альтернативный способ: сколько дней до будущей даты
'2024-12-31'::date - CURRENT_DATE AS days_until_new_year
FROM orders
WHERE id = 123;
⌛ Форматирование дат для отображения
Иногда нужно представить дату в определённом формате — для отчётов, пользовательского интерфейса и т.д.
-- Исходная дата: '2024-03-15 14:30:25'
-- Хотим получить различные форматы отображения
SELECT
created_at, -- Исходное значение: 2024-03-15 14:30:25
-- Форматируем как: 15.03.2024
-- DD = день (01-31), MM = месяц (01-12), YYYY = год (4 цифры)
TO_CHAR(created_at, 'DD.MM.YYYY') AS formatted_date_1,
-- Форматируем как: 15/03/24 (день/месяц/год 2 цифры)
-- YY = год (2 цифры)
TO_CHAR(created_at, 'DD/MM/YY') AS formatted_date_2,
-- Форматируем как: 15 марта 2024
-- Month = полное название месяца
TO_CHAR(created_at, 'DD Month YYYY') AS formatted_date_3,
-- Форматируем как: Friday, 15 March 2024
-- Day = полное название дня недели, Month = полное название месяца
TO_CHAR(created_at, 'Day, DD Month YYYY') AS formatted_date_4,
-- Форматируем как: 2024-03-15 (ISO формат)
TO_CHAR(created_at, 'YYYY-MM-DD') AS iso_date,
-- Форматируем время как: 14:30
-- HH24 = час (00-23), MI = минуты (00-59)
TO_CHAR(created_at, 'HH24:MI') AS time_only,
-- Форматируем как: 15.03.2024 14:30
TO_CHAR(created_at, 'DD.MM.YYYY HH24:MI') AS datetime_formatted
FROM orders
WHERE id = 123;
В следующем посте и заключительном по основам, разберем пару реальных задач и я дам несколько полезных советов по работе в этой области.
#SQL
📱 Подписаться на канал
💻 Курс автора по SQL DDL
🌎 Мой ИТ-стартап