问题
I am still pretty new to Azure platform, and learning SQL language. I have a question about creating a user-defined inline Table-valued function (without need a parameter) on Azure platform. Since accessing to Azure platform on my SQL Server Management Studio, whenever I create a log file by using the system built-in function GetDate(), it shows the date and time in UTC time zone, but I want my current time zone (Easter Time Zone) which is 4 hours behind of UTC. So, I am wondering if anyone can please guide me how I can create a inline-table-valued function that does not need any parameter, and able to use it as GetDate() function by simply running as below:
SELECT GetDate()
This is my attempt and I know this is not correct, but at least I tried.
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
Thanks in advance,
回答1:
Consider using DATETIMEOFFSET
and AT TIMEZONE
instead of DATEADD
. This will properly convert times across time zones and apply the appropriate time change rules. You can convert the DATETIMEOFFSET
result to another type (datetime2
in this example) if needed.
I don't think your intent is to include the parenthesis in the function name so I removed it in this example.
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
EDIT
A table-valued function can generally be used in queries wherever a table may be specified. For example:
SELECT handate FROM dbo.Azure_EST_GetDate();
Table-valued functions are appropriate when more than one column or row is returned. You could alternatively use a scalar function for your need since a scalar (single) value is returned. Below is the equivalent scalar function.
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
This scalar function can be used instead of GETDATE()
in Azure SQL Database to return a local time:
SELECT dbo.Azure_EST_GetDate_Scalar() AS handate;
来源:https://stackoverflow.com/questions/53027616/inline-table-valued-function-without-a-parameter