Skip to content

Команды SQL для получения текущих даты и времени в SQL Server

Пересказ статьи Rajendra Gupta. SQL Commands to check current Date and Time (Timestamp) in SQL Server


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

Рассматриваются команды (функции) SQL даты/времени для SQL Server, Azure SQL Database, Managed instance (MI) и Azure Synapse Analytics.

  • GETDATE()

  • CURRENT_TIMESTAMP

  • SYSDATETIME

  • GETUTCDATE

  • SYSUTCDATETIME

  • SYSDATETIMEOFFSET

Давайте разберемся в различиях между ними.

Функция GETDATE() в SQL Server


Команда (функция) GETDATE() возвращает системный штамп времени без указания часового пояса. Получаемое значение соответствует часовому поясу данного компьютера (сервера). Возвращаемое значение имеет тип DateTime.

Однако выполнение функции DateTime() в Azure SQL Database и Azure Synapse Analytics возвращает UTC (универсальную координату времени).



Вы можете прибавлять и отнимать даты из функций DateTime(). Например, DateTime()-1 возвращает штамп времени на вчера, а DateTime()+1 - на завтра.

SELECT getdate()-1 AS Yesterday,
getdate() AS Today,
getdate()+1 AS Tomorrow



Если нам потребуется интерпретация возвращаемого значения вне часового пояса UTC для Azure SQL Database или SQL Server, используйте функцию AT TIME ZONE.

Предположим, например, что мы хотим получить значение часового пояса индийского стандартного времени (IST) из функции getdate(). Следующий скрипт определяет текущий часовой пояс как UTC, а затем преобразует его к желаемому значению часового пояса.

SELECT GETDATE() AT TIME ZONE 'UTC' AT TIME ZONE 'India Standard Time'



Запрос к системной таблице, приведенный ниже, дает список поддерживаемых в Azure часовых поясов.

SELECT name AS TimeZone, Current_UTC_offset FROM sys.time_zone_info



CURRENT_TIMESTAMP


Команда (функция) SQL возвращает системный штамп времени подобно функции GETDATE(). Это эквивалент ANSI функции GETDATE() и может использоваться взаимозаменяемо в операторах T-SQL.



Как показано ниже, мы можем заменить GETDATE() на CURRENT_TIMESTAMP с функцией AT TIME ZONE для получения желаемого значения часового пояса.

SELECT CURRENT_TIMESTAMP AT TIME ZONE 'UTC' AT TIME ZONE 'India Standard Time'



SYSDATETIME()


Функция SYSDATETIME() возвращает более точное значение в дробной части секунды. Возвращаемое значение имеет тип datetime2 с точностью 7 десятичных знаков.



GETUTCDATE() и SYSUTCDATETIME()


Предположим вам требуется получить штамп времени UTC, несмотря на часовой пояс вашей системы. В этом случае вы можете использовать команды (функцию) SQL GETUTCDATE(), как показано ниже:



  • Тип данных возвращаемого значения: Datetime

  • Включается смещение часового пояса: Нет


SYSUTCDATE() также возвращает значение зоны UTC с более высокой точностью. Тип возвращаемого значения - DateTime2 с точностью 7.

SELECT SYSUTCDATETIME()  



SYSDATETIMEOFFSET()


Команда (функция) SYSDATETIMEOFFSET() возвращает значение на основе наличной операционной системы и часового пояса. Оно включает более высокую точность наряду со смещением часового пояса.

Как показано ниже, оно включает смещение часового пояса +00:00, которое означает, что это UTC.



Запрос для сравнения вывода различных функций даты/времени


Следующий запрос комбинирует все функции даты/времени SQL Server в операторе SELECT. Вы можете выполнить нижеприведенный запрос, чтобы сравнить возвращаемые значения. Он возвращает значение из GETDATE(), CURRENT_TIMESTAMP, SYSDATETIME, SYSDATETIMEOFFSET, GETUTCDATE, SYSUTCDATETIME:

SELECT 
GETDATE() AS [GETDATE()]
,CURRENT_TIMESTAMP AS [CURRENT_TIMESTAMP]
,SYSDATETIME() AS [SYSDATETIME()]
,SYSDATETIMEOFFSET() AS [SYSDATETIMEOFFSET()]
,GETUTCDATE() AS [GETUTCDATE()]
,SYSUTCDATETIME() AS [SYSUTCDATETIME()] ;

В моей базе данных Azure SQL Database запрос возвращает следующие значения:

  • GETDATE(): 2021-12-25 02:50:40.767

  • CURRENT_TIMESTAMP: 2021-12-25 02:50:40.767

  • SYSDATETIME():2021-12-25 02:50:40.7500000

  • SYSDATETIMEOFFSET(): 2021-12-25 02:50:40.7500000 +00:00

  • GETUTCDATE(): 2021-12-25 02:50:40.753

  • SYSUTCDATETIME: 2021-12-25 02:50:40.7534774


Во многих случаях нам не требуются значения штампа времени или смещения. В этом случае мы можем использовать функцию CONVERT(), и все функции возвращают только дату, как показано ниже.

SELECT 
CONVERT (date,GETDATE()) AS [GETDATE()]
,CONVERT (date,CURRENT_TIMESTAMP) AS [CURRENT_TIMESTAMP]
,CONVERT (date,SYSDATETIME()) AS [SYSDATETIME()]
,CONVERT (date,SYSDATETIMEOFFSET()) AS [SYSDATETIMEOFFSET()]
,CONVERT (date,GETUTCDATE()) AS [GETUTCDATE()]
,CONVERT (date,SYSUTCDATETIME()) AS [SYSUTCDATETIME()] ;



Аналогично, как показано ниже, мы можем использовать аргумент time в функции CONVERT(), чтобы извлечь только время из результата.

SELECT 
CONVERT (time,GETDATE()) AS [GETDATE()]
,CONVERT (time,CURRENT_TIMESTAMP) AS [CURRENT_TIMESTAMP]
,CONVERT (time,SYSDATETIME()) AS [SYSDATETIME()]
,CONVERT (time,SYSDATETIMEOFFSET()) AS [SYSDATETIMEOFFSET()]
,CONVERT (time,GETUTCDATE()) AS [GETUTCDATE()]
,CONVERT (time,SYSUTCDATETIME()) AS [SYSUTCDATETIME()] ;



Давайте рассмотрим несколько вариантов использования различных функций даты/времени в SQL Server и Azure SQL Database.

Следующий пример создает таблицу с именем [DemoSQLTable] и несколькими столбцами, имеющими значениями по умолчанию рассматриваемые функции – GETDATE(), CURRENT_TIMESTAMP и SYSDATETIME(). При вставке записи без явного указания значения оно берется из этих функций и сохраняется в соответствующих столбцах.

Create Table DemoSQLTable (
id int,
myGETDATE smalldatetime default GETDATE(),
myCurrentTimeStamp datetime default CURRENT_TIMESTAMP,
mySYSDATETIME datetime2 default SYSDATETIME()
);
GO
insert into DemoSQLTable (ID) values (1);
GO
Select * from DemoSQLTable;



Можем ли мы использовать функцию даты/времени в качестве параметра хранимой процедуры?


Часто требуются данные из таблиц, которые удовлетворяют диапазону дат или конкретной дате. Например, если записи о продажах заказчиков хранятся в таблице, нас может интересовать сделанные сегодня заказы или заказы за конкретный месяц или год.

Давайте создадим хранимую процедуру, использующую для демонстрации следующий запрос. Он определяет параметр @MyDateTime, имеющий тип данных DATETIME. Далее мы хотим фильтровать записи из таблицы [SalesLT].[SalesOrderDetail] на основе этого параметра.

CREATE PROC Test_DateTime_Proc
@MyDateTime DATETIME
as
SELECT [SalesOrderID]
,[SalesOrderDetailID]
,[OrderQty]
,[ProductID]
,[ModifiedDate]
FROM [SalesLT].[SalesOrderDetail]
WHERE [ModifiedDate]=@MyDateTime

Мы хотим использовать функции даты/времен для передачи значений параметру @MyDateTime. Если непосредственно передать функцию даты/времени для значения параметра, будет возникать ошибка, как показано ниже.

EXEC Test_DateTime_Proc @MyDateTime=getdate()



Чтобы выполнить хранимую процедуру с функцией даты/времени в качестве значения параметра, мы можем объявить переменную и сохранить вывод функции. Например, в T-SQL мы объявляем параметр @I и устанавливаем его значение с помощью функции GETDATE().

Declare @I datetime = getdate()
exec Test_DateTime_Proc @MyDateTime = @I;
GO

Скрипт отрабатывает без ошибок. В моем случае не находится строк, удовлетворяющих предикату, поэтому будет возвращено 0 строк.



Замечание. Функции даты/времени являются недетерминистическими в SQL Server. Следовательно, представление и выражение, которое ссылается на эту функцию в столбце, не может быть проиндексировано.
Категории: T-SQL

Обратные ссылки

Нет обратных ссылок

Комментарии

Показывать комментарии Как список | Древовидной структурой

Нет комментариев.

Автор не разрешил комментировать эту запись

Добавить комментарий

Enclosing asterisks marks text as bold (*word*), underscore are made via _word_.
Standard emoticons like :-) and ;-) are converted to images.

To prevent automated Bots from commentspamming, please enter the string you see in the image below in the appropriate input box. Your comment will only be submitted if the strings match. Please ensure that your browser supports and accepts cookies, or your comment cannot be verified correctly.
CAPTCHA

Form options

Добавленные комментарии должны будут пройти модерацию прежде, чем будут показаны.