3

我的查询中有一个日期时间列,我想在这个查询中做一个 CASE。

如果 DateDelivered 列不为空,则显示日期,否则,显示字符串 'Pendent' 我该怎么做?

CASE WHEN DateDelivered IS NOT NULL THEN DateDelivered ELSE 'Pendent' END AS DateDelivered 2

我收到了这个错误

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

整个查询

SELECT  San_Imovel.Imovel_Id ,
        San_Chave.DataHoraPegou ,
        CASE WHEN San_Chave.DateDelivered IS NOT NULL THEN San_Chave.DateDelivered
             ELSE ISNULL(CAST(San_Chave.DateDelivered AS VARCHAR), 'Pendent')
        END AS DateDelivered2 ,
        San_Usuario.NomeCompleto + ' - ' + sc.Apelido AS Nome ,
        San_Cliente.NomeCompleto AS NomeCliente ,
        San_Credenciada.Apelido ,
        San_Cliente.Cliente_Id ,
        San_ChaveImovel.QuantidadeChave
FROM    San_ChaveImovel
        JOIN San_Chave ON San_ChaveImovel.Chave_Id = San_Chave.Chave_Id
        JOIN San_Credenciada ON San_Chave.Credenciada_Id = San_Credenciada.Credenciada_Id
        JOIN San_Imovel ON San_ChaveImovel.Imovel_Id = San_Imovel.Imovel_Id
        JOIN San_Usuario ON San_Chave.Usuario_Id_Responsavel = San_Usuario.Usuario_Id
        JOIN San_Credenciada sc ON San_Usuario.Credenciada_Id = sc.Credenciada_Id
        JOIN San_Cliente ON San_Chave.Cliente_Id = San_Cliente.Cliente_Id  
4

2 回答 2

6

您正在尝试将“Pendent”转换为 DateTime,因为它将所有数据转换为相同的数据类型。此外,如果您只是检查 NULL,则可以使用 ISNULL 或 COALESCE。尝试这个:

ISNULL(CAST(DateDelivered AS VARCHAR), 'Pendent')

您还可以指定 DateDelivered 的格式:

ISNULL(CONVERT(VARCHAR, DateDelivered, 101), 'Pendent')

在此处查看 101 的更多选项。

于 2012-04-26T16:51:41.357 回答
2

CASE 运算符返回的值与第一个结果子句的类型和大小相同。由于您无法将“待定”转换为 DateTime 值,因此必须将日期值转换为他们的 varchar 表示形式:

CASE WHEN DateDelivered IS NOT NULL THEN CONVERT(VARCHAR(10), DateDelivered, 120)
ELSE 'Pendent'
END AS DateDelivered 

在此示例中,您可以使用 a 获得相同的结果ISNULL

ISNULL(CONVERT(VARCHAR(10), DateDelivered, 120), 'Pending') AS [DateDelivered]

注意 1:将日期值转换为 varchar 时,我总是更喜欢YYYY-MM-DDorder,因为它不是一种模棱两可的格式。

注意 2:请注意,CASE当它根据第一个结果子句的大小截断 varchar 值时,误用可能会导致更微妙的错误:

CASE WHEN 1=0 THEN 'A'
ELSE 'BBB'
END -- returns only 'B' !!!
于 2012-04-26T17:43:24.350 回答