使用CASE语句计算日期格式的SQL函数

时间:2015-10-20 15:40:38

标签: sql sql-server function case

我正在尝试创建一个函数,它将根据输入的参数值返回正确的日期格式,但我对语法没有好运。任何人都可以让它工作或有更高效/更好的方式去做这件事吗?

CREATE FUNCTION fn_DateFormat
(
    @DateFormat nvarchar(MAX)
)
RETURNS NVARCHAR(30)
AS
BEGIN
    SET CASE
           WHEN @DateFormat = 'YYYYMMDD' 
             THEN RETURN CONVERT(nvarchar(30), GETDATE(), 112)
           WHEN @DateFormat = 'DD MMM YYYY' 
             THEN RETURN CONVERT(nvarchar(30), GETDATE(), 106)
           ELSE NULL
        END

    RETURN @DateFormat
END;
GO

我收到以下错误消息:

  

消息156,级别15,状态1,过程fn_DateFormat,第12行
  关键字'CASE'附近的语法不正确。

     

消息156,级别15,状态1,过程fn_DateFormat,第14行
  关键字“WHEN”附近的语法不正确。

     

消息156,级别15,状态1,过程fn_DateFormat,第15行
  关键字“ELSE”附近的语法不正确。

     

Msg 102,Level 15,State 1,Procedure fn_DateFormat,Line 19
  ';'附近的语法不正确。

2 个答案:

答案 0 :(得分:0)

这是作为独立语句的语法:

SELECT CASE
        WHEN @DateFormat = 'YYYYMMDD' THEN CONVERT(nvarchar(30), GETDATE(), 112)
        WHEN @DateFormat = 'DD MMM YYYY' THEN CONVERT(nvarchar(30), GETDATE(), 106)
        ELSE @DateFormat
    END

在上下文中作为udf:

CREATE FUNCTION fn_DateFormat
(
    @DateFormat nvarchar(MAX)
)
RETURNS NVARCHAR(30)
AS
BEGIN
    declare @ret NVARCHAR(30)
    select @ret = 
        CASE
        WHEN @DateFormat = 'YYYYMMDD' THEN CONVERT(nvarchar(30), GETDATE(), 112)
        WHEN @DateFormat = 'DD MMM YYYY' THEN CONVERT(nvarchar(30), GETDATE(), 106)
        ELSE @DateFormat
        end

    return @ret
end

答案 1 :(得分:0)

您以错误的方式使用了SET。正确用法如下。请注意,SET需要跟随您尝试设置的变量名称。另外,您不应该RETURN函数内部CASE。这些都是我在下面发布的代码中处理的,这应该没有错误。

CREATE FUNCTION fn_DateFormat
(
    @DateFormat nvarchar(MAX)
)
RETURNS NVARCHAR(30)
AS
BEGIN
    SET @DateFormat = CASE
           WHEN @DateFormat = 'YYYYMMDD' 
             THEN CONVERT(nvarchar(30), GETDATE(), 112)
           WHEN @DateFormat = 'DD MMM YYYY' 
             THEN CONVERT(nvarchar(30), GETDATE(), 106)
           ELSE NULL
        END

    RETURN @DateFormat
END;
GO