没有参数的内联表值函数

时间:2018-10-28 01:22:07

标签: sql azure datetime azure-sql-database ssms

对于Azure平台,我仍然很陌生,并且正在学习SQL语言。我有一个关于在Azure平台上创建用户定义的内联表值函数(不​​需要参数)的问题。由于访问SQL Server Management Studio上的Azure平台,每当我使用系统内置函数 GetDate()创建日志文件时,它都会以UTC时区显示日期和时间。想要我的当前时区(Easter时区)比UTC晚4小时。因此,我想知道是否有人可以指导我如何创建不需要任何参数的内联表值函数,并能够通过简单地运行为 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 :(得分:1)

请考虑使用DATETIMEOFFSETAT 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

此标量函数可以代替Azure SQL数据库中的GETDATE()来返回本地时间:

SELECT dbo.Azure_EST_GetDate_Scalar() AS handate;