【问题标题】:SQL Server conversion error when using IIF on datetime field to output a string在日期时间字段上使用 IIF 输出字符串时 SQL Server 转换错误
【发布时间】:2020-06-18 05:51:59
【问题描述】:

我有以下选择语句:

SELECT IIF(DateFirstSeen IS NOT NULL, DateFirstSeen, 'Not Seen') as [Date First Seen]

但是当我运行它时,我得到了错误:

Conversion failed when converting character string to smalldatetime data type

有人可以帮忙吗?

【问题讨论】:

  • DateFirstSeen转换为字符串
  • 这能回答你的问题吗? How to convert DateTime to VarChar
  • 根据 Demo 的评论; IIF 期望第二个和第三个参数是相同的类型,如果它们不是必须转换为另一个。在您的情况下,IIF 看到 SMALL DATETIME 参数,假定这是您要返回的数据类型,然后遇到无法转换为 SMALLDATETIME 的字符串。因此,如果您希望 IIF 返回一个字符串,请给它两个字符串...为此,请将 DateFirstSeen 值转换为字符串...
  • 不,转换很简单,导致问题的是 IIF,如下所述,IIF() 的两个分支必须返回相同的数据类型

标签: sql sql-server string date tsql


【解决方案1】:

IIF() 的两个分支必须返回相同的数据类型,而您正在混合日期和字符串。

考虑先将日期转为字符串,例如:

 COALESCE(CONVERT(varchar, DateFirstSeen, 23), 'Not Seen')

请注意,在处理nulls 时,COALESCE()IIF() 相比会缩短逻辑。

【讨论】:

  • 你也可以在这里使用 ISNULL 函数 :)
  • @CR7SMS:是的。我更喜欢COALESCE(),因为它是标准 SQL - 所以大多数数据库都支持它。
【解决方案2】:

IIF() 返回单个值。但也有竞争类型。使用哪种类型? SQL 标准强调返回的是最限制性的类型,而不是最通用的。

要表示'Not Seen',您需要一个字符串。您应该使用 convert()format() 和适当的规范:

SELECT COALESCE(CONVERT(VARCHAR(255), DateFirstSeen, 120), 'Not Seen')

或者,学会和NULLs一起生活和爱。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多