Попробуйте использовать DATETIMEOFFSET
и AT TIMEZONE
вместо DATEADD
.Это будет правильно преобразовывать время в разных часовых поясах и применять соответствующие правила изменения времени.При необходимости вы можете преобразовать результат DATETIMEOFFSET
в другой тип (datetime2
в этом примере).
Не думаю, что вы намереваетесь включить скобку в имя функции, поэтому я удалил ее в этомпример.
CREATE FUNCTION [dbo].[Azure_EST_GetDate] (
)
RETURNS TABLE
AS
RETURN
(
SELECT CAST(SYSDATETIMEOFFSET() AT TIME ZONE 'Eastern Standard Time' AS datetime2(3)) AS handate
);
GO
РЕДАКТИРОВАТЬ
Табличную функцию обычно можно использовать в запросах везде, где может быть указана таблица.Например:
SELECT handate FROM dbo.Azure_EST_GetDate();
Табличные функции подходят, когда возвращается более одного столбца или строки.В качестве альтернативы вы можете использовать скалярную функцию для ваших нужд, поскольку возвращается скалярное (одиночное) значение.Ниже приведена эквивалентная скалярная функция.
CREATE FUNCTION [dbo].[Azure_EST_GetDate_Scalar] ()
RETURNS datetime2(3)
AS
BEGIN
RETURN CAST(SYSDATETIMEOFFSET() AT TIME ZONE 'Eastern Standard Time' AS datetime2(3));
END;
GO
Эту скалярную функцию можно использовать вместо GETDATE()
в базе данных SQL Azure для возврата локального времени:
SELECT dbo.Azure_EST_GetDate_Scalar() AS handate;