2017-06-07 22 views
1

返されたデータをSQL Server 2016で変更するためにクエリを実行していますが、変換エラーが発生しています(文字列から日付および/または時刻を変換すると変換できませんでした)。NULLを使用してNULL日付を変換する

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型です。この列のdatetime形式は(YYYY-MM-DD HH:MM:SS.mmm)またはNULLです。私はコードを少し読みやすくするためにCOALESCEを使ってみましたが、それもうまくいかず、同じエラーが出ました。返された結果セットをエラーのポイントまで表示すると、この列にNULLを持つ最初のローで失敗しています。私は間違っている/考えていないことは何ですか?

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

あなたのケースでは、異なる戻り値の型を持つ 'case'を使用することはできません。 –

答えて

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; 

結果の形式を指定する3番目のパラメーターを追加できます。または、FORMAT()関数自体を使用します。

1

結果セット(このクエリの出力)は、各フィールドに同じフィールドタイプを持つ必要があります。これは派生テーブルのようなものなので、jact.start_execution_dateの日付と同じフィールドにvarchar 'No Execution'を置くことはできません。

ただし、VARCHAR()などの日付をキャストすることができます

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

はちょうどあなたの日付は、今、これはどこかで出力されている場合は結構です、文字列、日付、であることを知っています。

関連する問題