使用 IS NULL 转换 NULL 日期

Using IS NULL to convert NULL dates

我是 运行 查询以更改 SQL Server 2016 中的一些返回数据,我收到转换错误(转换日期 and/or 时间时转换失败字符串).

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 的第一行失败。我在做什么 wrong/not 考虑?

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

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

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

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

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

据推测,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() 函数本身。