Основы работы с датой и временем в SQL

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

Типы данных для даты и времени

  1. DATE: хранит только дату (год, месяц, день).

  2. TIME: хранит только время (часы, минуты, секунды).

  3. DATETIME: хранит дату и время (год, месяц, день, часы, минуты, секунды).

  4. DATETIME2: расширенная версия DATETIME, точность до 100 наносекунд.

  5. SMALLDATETIME: хранит дату и время с меньшей точностью, чем DATETIME.

  6. TIMESTAMP: хранит уникальное значение времени для отслеживания изменений, но не предназначен для хранения даты и времени (вместо этого используйте ROWVERSION в SQL Server).

Основные функции для работы с датой и временем

Текущая дата и время

  • GETDATE() (SQL Server): возвращает текущую дату и время.

  • CURRENT_TIMESTAMP (SQL Server, PostgreSQL, MySQL): возвращает текущую дату и время.

  • NOW() (MySQL, PostgreSQL): возвращает текущую дату и время.

Пример:

SELECT GETDATE() AS CurrentDateTime;     -- SQL Server
SELECT CURRENT_TIMESTAMP AS CurrentDateTime; -- SQL Server, PostgreSQL
SELECT NOW() AS CurrentDateTime;         -- MySQL, PostgreSQL

Извлечение компонентов даты и времени

  • YEAR(date): возвращает год.

  • MONTH(date): возвращает месяц.

  • DAY(date): возвращает день.

  • DATEPART(part, date) (SQL Server): возвращает указанную часть даты.

  • EXTRACT(part FROM date) (PostgreSQL): возвращает указанную часть даты.

Примеры:

SELECT YEAR(GETDATE()) AS CurrentYear;       -- SQL Server
SELECT MONTH(GETDATE()) AS CurrentMonth;     -- SQL Server
SELECT DAY(GETDATE()) AS CurrentDay;         -- SQL Server

SELECT DATEPART(YEAR, GETDATE()) AS CurrentYear;  -- SQL Server
SELECT DATEPART(MONTH, GETDATE()) AS CurrentMonth; -- SQL Server
SELECT DATEPART(DAY, GETDATE()) AS CurrentDay;     -- SQL Server

SELECT EXTRACT(YEAR FROM NOW()) AS CurrentYear;   -- PostgreSQL
SELECT EXTRACT(MONTH FROM NOW()) AS CurrentMonth; -- PostgreSQL
SELECT EXTRACT(DAY FROM NOW()) AS CurrentDay;     -- PostgreSQL

Форматирование дат

  • FORMAT(date, format) (SQL Server): форматирует дату в строку.

  • TO_CHAR(date, format) (PostgreSQL, Oracle): форматирует дату в строку.

  • DATE_FORMAT(date, format) (MySQL): форматирует дату в строку.

Примеры:

SELECT FORMAT(GETDATE(), 'yyyy-MM-dd') AS FormattedDate; -- SQL Server
SELECT TO_CHAR(NOW(), 'YYYY-MM-DD') AS FormattedDate;    -- PostgreSQL
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d') AS FormattedDate;  -- MySQL

Добавление и вычитание интервалов

  • DATEADD(datepart, number, date) (SQL Server): добавляет интервал к дате.

  • DATE_SUB(date, INTERVAL number unit) (MySQL): вычитает интервал из даты.

  • DATEADD и INTERVAL (PostgreSQL): добавляет или вычитает интервал из даты.

Примеры:

SELECT DATEADD(day, 5, GETDATE()) AS DatePlus5Days;       -- SQL Server
SELECT DATEADD(month, -2, GETDATE()) AS DateMinus2Months; -- SQL Server

SELECT NOW() + INTERVAL 5 DAY AS DatePlus5Days;    -- MySQL
SELECT NOW() - INTERVAL 2 MONTH AS DateMinus2Months; -- MySQL

SELECT NOW() + INTERVAL '5 day' AS DatePlus5Days;    -- PostgreSQL
SELECT NOW() - INTERVAL '2 month' AS DateMinus2Months; -- PostgreSQL

Разница между датами

  • DATEDIFF(datepart, start_date, end_date) (SQL Server): возвращает разницу между двумя датами.

  • DATEDIFF(unit, start_date, end_date) (MySQL): возвращает разницу между двумя датами.

  • AGE(date) (PostgreSQL): возвращает интервал между двумя датами.

Примеры:

SELECT DATEDIFF(day, '2024-01-01', GETDATE()) AS DaysBetween;   -- SQL Server
SELECT DATEDIFF(DAY, '2024-01-01', NOW()) AS DaysBetween;        -- MySQL

SELECT AGE(NOW(), '2024-01-01') AS AgeDifference;   -- PostgreSQL

Примеры использования в запросах

Поиск записей по дате

SELECT * FROM Orders
WHERE OrderDate >= '2024-01-01' AND OrderDate < '2024-02-01';

Форматирование даты в отчетах

SELECT OrderID, FORMAT(OrderDate, 'yyyy-MM-dd') AS FormattedOrderDate
FROM Orders;

Добавление временных меток к записям

INSERT INTO Events (EventName, EventDate)
VALUES ('New Year Celebration', DATEADD(year, 1, GETDATE()));

Эти функции и методы помогут вам эффективно управлять датами и временем в SQL. Разные СУБД могут иметь свои особенности, поэтому всегда полезно проверять документацию для конкретной системы.

Last updated