SQL-Ex blog
Команды SQL для получения текущих даты и времени в SQL Server
Добавил Sergey Moiseenko on Суббота, 28 января. 2023
В приложениях баз данных текущие дата и время используются разными способами. Будь это создание журналов аудита, записи продаж, триггеры базы данных или, поскольку вам просто потребовалось узнать текущие дату и время, знание различных способов их получения может быть очень полезным. Здесь обсуждаются различные функции текущей даты в 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()] ;
- 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
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. Следовательно, представление и выражение, которое ссылается на эту функцию в столбце, не может быть проиндексировано.
Обратные ссылки
Нет обратных ссылок
Комментарии
Показывать комментарии Как список | Древовидной структурой
Автор не разрешил комментировать эту запись
Как вывести дату в sql
Чтобы вывести дату в SQL, используйте функцию DATE_FORMAT() . Синтаксис функции выглядит следующим образом:
DATE_FORMAT(date, format)
где date — это дата, которую вы хотите отформатировать, а format — это строка формата, которая определяет, как должна быть отформатирована дата.
Например, чтобы вывести текущую дату в формате ГГГГ-ММ-ДД, используйте следующий запрос:
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d');
В результате выполнения этого запроса вы увидите дату в формате ГГГГ-ММ-ДД, например, 2023-04-08.
Вы также можете использовать функции для работы с датами, такие как NOW() , CURDATE() , CURTIME() , чтобы получить текущую дату и время, текущую дату и текущее время соответственно.
Некоторые примеры форматирования дат:
- ‘%Y-%m-%d’ — ГГГГ-ММ-ДД (например, 2023-04-08)
- ‘%Y-%m-%d %H:%i:%s’ — ГГГГ-ММ-ДД ЧЧ:ММ:СС (например, 2023-04-08 13:30:45)
- ‘%d-%m-%Y’ — ДД-ММ-ГГГГ (например, 08-04-2023)
Обратите внимание, что форматирование даты может отличаться в зависимости от используемой СУБД.
Текущая дата на сервере
PostgreSQL поддерживает все типы данных, предусмотренные стандартом SQL для даты и времени. Даты обрабатываются в соответствии с григорианским календарем.
В таблице ниже перечислены поддерживаемые типы даты/времени
Имя | Описание | Наименьшее значение | Наибольшее значение | Точность |
---|---|---|---|---|
timestamp [ (p) ] [ without time zone ] | дата и время без часового пояса | 4713 до н. э. | 294276 н. э. | 1 микросекунда |
timestamp [ (p) ] with time zone | дата и время с часовым поясом | 4713 до н. э. | 294276 н. э. | 1 микросекунда |
date | дата (без времени суток) | 4713 до н. э. | 5874897 н. э. | 1 день |
time [ (p) ] [ without time zone ] | время суток (без даты) | 00:00:00 | 24:00:00 | 1 микросекунда |
time [ (p) ] with time zone | время суток (без даты), с часовым поясом | 00:00:00+1559 | 24:00:00-1559 | 1 микросекунда |
interval [ поля ] [ (p) ] | временной интервал | -178000000 лет | 178000000 лет | 1 микросекунда |
В таблице используются следующие обозначения
- [. ] — в квадратных скобках указываются необязательные поля.
- (p) — точность хранения данных, количество разрядов в дробной части секунды.
Время с указанием часового пояса time with time zone стоит использовать с осторожностью. В этом типе не хранится дата, а смещение часового пояса может изменяться при переходе на летнее/зимнее время.
При работе с датами есть много нюансов, особенно с часовыми поясами. Но обо всем по порядку.
Получение текущей даты
Текущую дату на сервере можно получить с помощью функции CURRENT_DATE .
SELECT CURRENT_DATE
# | current_date |
---|---|
1 | 2022-12-06 |
Функция CURRENT_DATE возвращает текущую дату с типом данных date .
Получение даты со временем
Для получения текущей даты со временем есть две функции:
- CURRENT_TIMESTAMP — возвращает текущую дату со временем с указанием часового пояса (тип данных timestamp with time zone).
- LOCALTIMESTAMP — возвращает текущую дату со временем без указания часового пояса (тип данных timestamp without time zone).
SELECT CURRENT_TIMESTAMP, LOCALTIMESTAMP
# | current_timestamp | localtimestamp |
---|---|---|
1 | 2022-12-06 12:13:39.414652+07 | 2022-12-06 12:13:39.414652 |
Получение времени
Для получения времени есть также две функции:
- CURRENT_TIME — возвращает текущее время с указанием часового пояса (тип данных time with time zone)
- LOCALTIME — возвращает текущее время без указания часового пояса (тип данных time with time zone)
SELECT CURRENT_TIME, LOCALTIME
# | current_time | localtime |
---|---|---|
1 | 12:18:52.072083+07 | 12:18:52.072083 |
Обрати внимание, что текущая дата и время берутся с сервера, на котором запущена СУБД.
8.13 TO_CHAR — форматирование числа
9.2 Точность хранения времени
GETDATE (Transact-SQL)
Возвращает текущую системную метку времени базы данных в виде значения datetime без смещения часового пояса базы данных. Это значение наследуется от операционной системы компьютера, на котором работает экземпляр SQL Server.
SYSDATETIME и SYSUTCDATETIME имеют большую точность в долях секунды, чем GETDATE и GETUTCDATE. SYSDATETIMEOFFSET включает смещение часового пояса, заданное в системе. SYSDATETIME, SYSUTCDATETIME и SYSDATETIMEOFFSET можно присваивать переменным любого типа даты и времени.
База данных SQL Azure (за исключением Управляемого экземпляра SQL Azure) и Azure Synapse Analytics используют время в формате UTC. Если необходимо интерпретировать сведения о дате и времени в часовом поясе, отличном от UTC, используйте AT TIME ZONE в Базе данных SQL Azure или Azure Synapse Analytics.
Обзор всех типов данных и функций даты и времени в языке Transact-SQL см. в статье Типы данных и функции даты и времени (Transact-SQL).
Синтаксис
GETDATE()
Тип возвращаемых данных
datetime
Remarks
Инструкции языка Transact-SQL могут ссылаться на функцию GETDATE в любом месте, где они могут ссылаться на выражение типа datetime.
GETDATE является недетерминированной функцией. Невозможно проиндексировать представления и выражения, ссылающиеся на эту функцию в столбце.
Использование SWITCHOFFSET с функцией GETDATE() может вызвать замедление выполнения запроса, поскольку оптимизатор запросов не может получить точные оценки количества элементов для значения GETDATE. Рекомендуется заранее вычислить значение GETDATE, а затем указать это значение в запросе, как показано в следующем примере. Кроме того, с помощью указания запроса OPTION (RECOMPILE) можно вынудить оптимизатор запросов повторно компилировать план запроса при каждом выполнении одного и того же запроса. В этом случае оптимизатор будет иметь точные оценки количества элементов для GETDATE(), что позволит ему сформировать более эффективный план запроса.
DECLARE @dt datetimeoffset = switchoffset (CONVERT(datetimeoffset, GETDATE()), '-04:00'); SELECT * FROM t WHERE c1 > @dt OPTION (RECOMPILE);
Примеры
В следующих примерах с помощью шести системных функций SQL Server, которые возвращают текущую дату и время, происходит возврат даты, времени или и того и другого. Значения возвращаются последовательно и поэтому могут различаться на доли секунды.
A. Получение текущей системной даты и времени
SELECT SYSDATETIME() ,SYSDATETIMEOFFSET() ,SYSUTCDATETIME() ,CURRENT_TIMESTAMP ,GETDATE() ,GETUTCDATE();
SYSDATETIME() 2007-04-30 13:10:02.0474381 SYSDATETIMEOFFSET()2007-04-30 13:10:02.0474381 -07:00 SYSUTCDATETIME() 2007-04-30 20:10:02.0474381 CURRENT_TIMESTAMP 2007-04-30 13:10:02.047 GETDATE() 2007-04-30 13:10:02.047 GETUTCDATE() 2007-04-30 20:10:02.047
Б. Получение текущей системной даты
SELECT CONVERT (date, SYSDATETIME()) ,CONVERT (date, SYSDATETIMEOFFSET()) ,CONVERT (date, SYSUTCDATETIME()) ,CONVERT (date, CURRENT_TIMESTAMP) ,CONVERT (date, GETDATE()) ,CONVERT (date, GETUTCDATE());
SYSDATETIME() 2007-05-03 SYSDATETIMEOFFSET() 2007-05-03 SYSUTCDATETIME() 2007-05-04 CURRENT_TIMESTAMP 2007-05-03 GETDATE() 2007-05-03 GETUTCDATE() 2007-05-04
В. Получение текущего системного времени
SELECT CONVERT (time, SYSDATETIME()) ,CONVERT (time, SYSDATETIMEOFFSET()) ,CONVERT (time, SYSUTCDATETIME()) ,CONVERT (time, CURRENT_TIMESTAMP) ,CONVERT (time, GETDATE()) ,CONVERT (time, GETUTCDATE());
SYSDATETIME() 13:18:45.3490361 SYSDATETIMEOFFSET() 13:18:45.3490361 SYSUTCDATETIME() 20:18:45.3490361 CURRENT_TIMESTAMP 13:18:45.3470000 GETDATE() 13:18:45.3470000 GETUTCDATE() 20:18:45.3470000
Примеры: Azure Synapse Analytics и Система платформы аналитики (PDW)
В приведенных ниже примерах с помощью трех системных функций SQL Server, которые возвращают текущую дату и время, происходит получение даты, времени или и того и другого. Значения возвращаются последовательно и поэтому могут различаться на доли секунды.
Г. Получение текущей системной даты и времени
SELECT SYSDATETIME() ,CURRENT_TIMESTAMP ,GETDATE();
Д. Получение текущей системной даты
SELECT CONVERT (date, SYSDATETIME()) ,CONVERT (date, CURRENT_TIMESTAMP) ,CONVERT (date, GETDATE());
Е. Получение текущего системного времени
SELECT CONVERT (time, SYSDATETIME()) ,CONVERT (time, CURRENT_TIMESTAMP) ,CONVERT (time, GETDATE());