GETDATE: примеры (SQL)
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 для согласованности в распределенных средах.
Расширенные примеры использования
Определение дня недели для текущей даты:
SELECT DATENAME(weekday, GETDATE()) AS WeekdayName;WeekdayName ----------- Sunday
Генерация уникального временного идентификатора:
SELECT REPLACE(CONVERT(varchar, GETDATE(), 120), '-', '') +
RIGHT('000' + CAST(DATEPART(ms, GETDATE()) AS varchar), 3);20231015143045123
Автоматическое обновление поля модификации в триггере:
CREATE TRIGGER UpdateModifiedDate
ON Products AFTER UPDATE
AS
BEGIN
UPDATE Products
SET ModifiedDate = GETDATE()
WHERE ID IN (SELECT ID FROM inserted);
END;Сравнение времени с учетом только даты:
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