GETDATE: примеры (SQL)

Использование функции GETDATE для работы с датой и временем
Раздел: Даты и времени функции, Дата и время
GETDATE: datetime

Описание функции GETDATE в MS SQL

Функция GETDATE в Microsoft SQL Server возвращает текущую системную дату и время в формате типа datetime. Эта функция не требует аргументов и является детерминированной только в рамках одного запроса, если используется в вычисляемых столбцах или индексированных представлениях.

Функция широко применяется для записи временных меток, фильтрации данных по текущему времени, вычисления интервалов и установки значений по умолчанию в таблицах.

Возвращаемый тип данных - datetime, который включает дату и время с точностью до 3.33 миллисекунд. Значение основано на системном времени компьютера, на котором работает экземпляр SQL Server, и соответствует часовому поясу операционной системы.

Простые примеры применения GETDATE

Базовый вызов функции для получения текущей даты и времени:

SELECT GETDATE() AS CurrentDateTime;
CurrentDateTime
-----------------------
2023-10-15 14:30:45.123

Использование в INSERT для записи временной метки:

INSERT INTO Orders (OrderDate, CustomerID) 
VALUES (GETDATE(), 12345);

Фильтрация записей за последние 24 часа:

SELECT * FROM LogTable 
WHERE EventTime >= DATEADD(hour, -24, GETDATE());

Альтернативные функции даты и времени в MS SQL

SYSDATETIME - возвращает значение типа datetime2 с более высокой точностью (100 наносекунд).

CURRENT_TIMESTAMP - стандартная SQL функция, аналогичная GETDATE, но соответствующая стандарту ISO.

GETUTCDATE - возвращает текущую дату и время в формате UTC.

SYSUTCDATETIME - комбинация предыдущих: высокая точность в формате UTC.

Выбор зависит от требований к точности, необходимости соответствия стандартам или работы с часовыми поясами.

Типичные ошибки при работе с GETDATE

Неправильное использование в вычисляемых столбцах без учета недетерминированности:

CREATE TABLE Example (
  ID int,
  Created datetime DEFAULT GETDATE(),
  Modified AS (GETDATE()) -- Ошибка при создании индекса
);

Путаница с часовыми поясами при миграции данных:

-- Разные результаты на серверах с разными часовыми поясами
SELECT GETDATE() AS LocalTime, GETUTCDATE() AS UTCTime;

Проблемы с производительностью при частом вызове в одном запросе:

-- Каждый вызов может возвращать немного разное время
SELECT GETDATE() AS Time1, GETDATE() AS Time2;

Изменения в последних версиях SQL Server

В SQL Server 2008 были добавлены функции SYSDATETIME, SYSUTCDATETIME с повышенной точностью.

Начиная с SQL Server 2016, улучшена поддержка временных таблиц с автоматическим отслеживанием времени через SYSTEM_TIME.

В Azure SQL Database поведение GETDATE синхронизировано с временем UTC для согласованности в распределенных средах.

Расширенные примеры использования

Определение дня недели для текущей даты:

Пример sql
SELECT DATENAME(weekday, GETDATE()) AS WeekdayName;
WeekdayName
-----------
Sunday

Генерация уникального временного идентификатора:

Пример sql
SELECT REPLACE(CONVERT(varchar, GETDATE(), 120), '-', '') + 
       RIGHT('000' + CAST(DATEPART(ms, GETDATE()) AS varchar), 3);
20231015143045123

Автоматическое обновление поля модификации в триггере:

Пример sql
CREATE TRIGGER UpdateModifiedDate
ON Products AFTER UPDATE
AS
BEGIN
  UPDATE Products
  SET ModifiedDate = GETDATE()
  WHERE ID IN (SELECT ID FROM inserted);
END;

Сравнение времени с учетом только даты:

Пример sql
SELECT * FROM Events
WHERE CONVERT(date, EventDate) = CONVERT(date, GETDATE());

Аналоги в других СУБД

MySQL: NOW(), CURRENT_TIMESTAMP

SELECT NOW();
2023-10-15 14:30:45

Oracle: SYSDATE, CURRENT_DATE

SELECT SYSDATE FROM DUAL;
15-OCT-2023 14:30:45

PostgreSQL: NOW(), CURRENT_TIMESTAMP

SELECT NOW();
2023-10-15 14:30:45.123456+03

SQLite: datetime('now'), CURRENT_TIMESTAMP

SELECT datetime('now');
2023-10-15 14:30:45

MS SQL GETDATE function comments

En
GETDATE Returns the current database system timestamp as a datetime value