试图创建一个将日期格式“ 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
答案 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使其变得更加复杂,并且没有提供任何明显的好处。