2016-11-02 7 views
1

SQL Serverでsysjobsとsysjobhistoryを使用していますが、私はグーグルで検索していますが、この質問に直接答えは見つからないようです。私はWHERE句でこれをやろうとしているからだと思います。WHERE句でINTをDATEに変換する - TSQL

基本的には、実行した日(基本的に今日の日付)に失敗したジョブを選択しようとしています。現在のコードは、失敗した既存のジョブをすべて選択しているためです。

以下

が私のコードです:

メッセージ529、レベル16、状態2、行13
日までのデータ型intからの明示的な変換を:

SELECT DISTINCT 
    sj.name, 
    COUNT(sjh.instance_id) AS errors 
FROM 
    msdb..sysjobhistory sjh 
JOIN 
    msdb.dbo.sysjobs sj ON sj.job_id = sjh.job_id 
WHERE 
    name IN ('SQLAgentJob1', 'SQLAgentJob2') 
    AND sjh.run_status = 1 
    AND (SELECT CONVERT(DATE, CONVERT(INT, sjh.run_date), 112)) = (SELECT CONVERT(DATE, GETDATE(), 112)) 
GROUP BY 
    sj.name 

私はというエラーを取得しておきます許可されていません。

+0

サブクエリのポイントは何ですか? –

+0

サブクエリにある必要はないと仮定していますか? – AznDevil92

+0

問題の根源ではありませんが、サブクエリである必要はありません。 –

答えて

4

あなたは自分のパラメータが112で分離されていない日付フォーマットに(つまり、現在の日付)に変換、これらすべての変換を行う必要はありません。

SELECT DISTINCT sj.name, COUNT(sjh.instance_id) AS errors 
FROM msdb..sysjobhistory sjh 
JOIN msdb.dbo.sysjobs sj ON sj.job_id = sjh.job_id 
WHERE name IN ('SQLAgentJob1','SQLAgentJob2') 
    AND sjh.run_status = 1 
    AND sjh.run_date= CONVERT(nvarchar(8), GETDATE(), 112) 
GROUP BY sj.name 

があるので、日付変換への整数がありません日付の整数表現はありません。

run_date列は、恐らく何らかの理由でスペース消費(8バイトではなく4バイト)を減らすために、整数としてYYYYMMDD形式を格納します。

これと比較するには、同等の文字列をCONVERT(nvarchar(8), GETDATE(), 112)で作成してください。文字列から整数への変換は暗黙的です

+0

Plus1変換1回のみの変換 –

+1

複数のコンバージョンが原因でこのクエリが失敗する原因 –

+0

回答とjhildenの回答には違いがありますか?どちらも同じ結果を返しました。私は両方が同じ論理を持っていると仮定しています。 – AznDevil92

1

これは動作するはずです。

SELECT DISTINCT sj.name, 
    COUNT(sjh.instance_id) AS errors 
FROM msdb..sysjobhistory sjh 
JOIN msdb.dbo.sysjobs sj ON sj.job_id = sjh.job_id 
WHERE name IN ('SQLAgentJob1', 
       'SQLAgentJob2') 
      AND sjh.run_status = 1 
      AND CAST(CONVERT(datetime, CAST(SJH.[run_date] AS CHAR(8))) as DATE) = CAST(GETDATE() as DATE) 
      GROUP BY sj.name 

説明

  • まず
  • は、今日の日付と比較します(時間をドロップ)までに日時からダウンキャストint型のdatetimeへ
  • から(時間とドロップ)さ変換
  • +0

    これらの変換をすべて実行する理由はありません –

    +0

    私は同意します。 – jhilden