创建函数以将日期拆分为年,月,日,将其拆分为SQL中的单独列

时间:2018-09-10 18:17:02

标签: sql tsql sql-server-2008

试图创建一个将日期格式“ 2018-05-21”分割为2018的函数| 05 | 21 |作为三个独立的列。尝试按以下方式创建函数,但在“月”,“日”上出现错误。错误说:“'month'附近的语法不正确。期望为'('或Select。”

CREATE FUNCTION [dbo].[functionname]
(
    -- Add the parameters for the function here
    @DateFormat AS DATETIME
)
RETURNS VARCHAR (MAX)
AS
    BEGIN
        RETURN  DATEPART(YEAR,@DateFormat),
                DATEPART(Month,@DateFormat),
                DATEPART(Day,@DateFormat)

    END
GO

1 个答案:

答案 0 :(得分:2)

当前SQL的问题是标量仅返回单个值。您需要使用表值函数来获取多个列。

这是TVF版本,将提供三列

CREATE FUNCTION [dbo].[FunctionName]
(
    @DateFormat AS DATETIME
)
RETURNS TABLE AS RETURN
(
    SELECT DATEPART(YEAR,@DateFormat) AS [Year],
       DATEPART(Month,@DateFormat) AS [Month],
       DATEPART(Day,@DateFormat) AS [Day]
)

用法示例:

DECLARE @dates TABLE (SomeDate DATE)
INSERT INTO @dates SELECT '01/25/2018'
INSERT INTO @dates SELECT '10/01/2008'

SELECT d.*,fn.* FROM @dates d
CROSS APPLY [dbo].[FunctionName](d.SomeDate) fn

还有一些documentation

也就是说,我个人不喜欢这种实现。我只是希望在SQL的SELECT部分​​使用DATEPART语句。我认为TVF使其变得更加复杂,并且没有提供任何明显的好处。