CASE 表达式中的转换失败

Conversion Failed in a CASE expression

我有一个 varchar 类型的列,它包含日期和 '#':

31.01.2022
31.01.2022
30.11.2021
31.12.2021
30.11.2021
28.02.2022
28.02.2022
#

我正在尝试将日期转换为标准日期格式 (YYYY-MM-DD),并在出现时保留“#”。

这是我的代码:

CASE 
    WHEN table.CalendarColumn='#' THEN '#'
    ELSE CONVERT(date, table.CalendarColumn, 104) END AS Calendar

结果栏也是varchar(10)类型(与原始栏相同)。

我希望在单元格为 # 时得到 #,在单元格不是 # 时得到转换后的日期,但我却收到此错误:

Conversion failed when converting date and/or time from character string.

由于数据类型的优先级,编译器正在尝试将 # 转换为日期。

因此您需要将 date 值转换回 varchar,以您想要的样式代替。更短的语法是使用 TRY_CONVERTISNULL

SELECT
  ISNULL(
    CONVERT(varchar(20),
      TRY_CONVERT(date, table.CalendarColumn, 104),
      23),
    table.CalendarColumn) AS Calendar
FROM....

db<>fiddle