Встроенная табличная функция без параметра - PullRequest
0 голосов
/ 28 октября 2018

Я все еще новичок в платформе Azure и изучаю язык SQL. У меня есть вопрос о создании определяемой пользователем встроенной табличной функции (без параметра) на платформе Azure. Начиная с доступа к платформе Azure в моей SQL Server Management Studio, всякий раз, когда я создаю файл журнала с помощью встроенной в систему функции GetDate () , он показывает дату и время в часовом поясе UTC, но я хочу мой текущий часовой пояс (Пасхальный часовой пояс), который на 4 часа отстает от UTC. Итак, мне интересно, если кто-нибудь может подсказать мне, как я могу создать функцию со встроенными табличными значениями, которая не нуждается в каком-либо параметре и может использовать ее как GetDate () , просто выполнив, как показано ниже :

            SELECT GetDate() 

Это моя попытка, и я знаю, что это неверно, но, по крайней мере, я пытался.

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION [dbo].[Azure_EST_GetDate()] (
)

RETURNS TABLE 
AS
RETURN 
(

    SELECT DATEADD(hh,-4,GETDATE()) AS 'handate'
)
GO

Заранее спасибо,

1 Ответ

0 голосов
/ 28 октября 2018

Попробуйте использовать 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;
...