【问题标题】:Using IS NULL to convert NULL dates使用 IS NULL 转换 NULL 日期
【发布时间】:2017-06-07 12:41:00
【问题描述】:

我正在运行查询以更改 SQL Server 2016 中的一些返回数据,但出现转换错误(从字符串转换日期和/或时间时转换失败)。

SELECT jobs.name,
       CASE WHEN jact.start_execution_date IS NULL THEN 'No Execution'
            ELSE jact.start_exeuction_date
       END AS start_execution_date
FROM   msdb.dbo.sysjobactivity jact
       INNER JOIN msdb.dbo.sysjobs jobs
         ON jact.job_id = jobs.job_id

start_execution_date 列是 DATETIME 类型。此列的日期时间格式为 (YYYY-MM-DD HH:MM:SS.mmm) 或 NULL。我什至尝试使用 COALESCE 使代码更易于阅读,但这也不起作用并给出了同样的错误。在查看设置到错误点的返回结果时,它在该列中具有 NULL 的第一行失败。我做错了什么/没有考虑?

SELECT COALESCE(jact.start_execution_date, 'No Execution')

【问题讨论】:

  • 您不能将case 与不同的返回类型一起使用..varchar 和日期在您的情况下。

标签: sql tsql sql-server-2016


【解决方案1】:

大概start_execution_date 是一个日期。所以,你需要转换它。最简单的方法是:

SELECT . . .,
       COALESCE(CONVERT(VARCHAR(255), jact.start_execution_date), 
                'No Execution'
               ) as start_execution_date
FROM msdb.dbo.sysjobactivity jact INNER JOIN
     msdb.dbo.sysjobs jobs
     ON jact.job_id = jobs.job_id;

您可以添加第三个参数来指定结果的格式。或者,使用 FORMAT() 函数本身。

【讨论】:

    【解决方案2】:

    您的结果集(此查询的输出)必须在每个字段中具有相同的字段类型。它就像一个派生表,因此您不能将 varchar 'No Execution' 与来自 jact.start_execution_date 的日期驻留在同一字段中。

    但是,您可以将日期转换为 VARCHAR(),例如:

    COALESCE(CAST(jact.start_execution_date AS VARCHAR(20), 'No Execution') as start_execution_date
    

    只要知道你的日期现在是一个字符串日期,如果它被输出到某个地方就可以了。

    【讨论】:

      猜你喜欢
      • 2013-09-25
      • 2016-08-21
      • 1970-01-01
      • 1970-01-01
      • 2017-04-03
      • 1970-01-01
      • 2021-03-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多