0

継承されたコードに取り組んでおり、その中の SQL クエリに問題があります。クエリは次のとおりです。

Select distinct 
    g.scriptid,
    g.procedurename,
    h.parameters,
    g.scriptname,
    h.usercode,
    h.facility,
    h.recid,
    cast((cast(recid as varchar) + '.' +  Right('0000' + cast(scriptgennum as varchar), 4)) as decimal(10,4)) as 'scriptrecid',
    scriptgennum+1 as 'scriptgennum',
    h.generated,
    h.runinterval,
    case 
        when runinterval = 'M' then dateadd(month,1,convert(varchar(10),h.nextrundate,120)) 
        when runinterval = 'Q' then dateadd(month,3,convert(varchar(10),h.nextrundate,120)) 
        when runinterval = 'W' then dateadd(week,1,convert(varchar(10),h.nextrundate,120))  
        when runinterval = '0' then NULL end as 'nextrundate',
    convert(varchar(10),getdate(),120) as currentrundate,
    scripttype

    from PATIENTLETTERS_SCRIPTHIST h join PATIENTLETTERS_SCRIPTS g on
        g.scriptid = h.scriptid where 
        h.status = 'Y' 
        and (([runinterval] = 'M'
            and (convert(varchar(10),nextrundate,120) = convert(varchar(10),getdate(),120)
            and datepart(day,getdate()) = 5
            and (datediff(month,convert(varchar(10),h.lastrundate,120),convert(varchar(10),getdate(),120)) = 1)
            or lastrundate is null))
        or ([runinterval] = 'Q'
            and (convert(varchar(10),nextrundate,120) = convert(varchar(10),getdate(),120)
            and datepart(weekday,getdate()) = 0
            and (datediff(month,convert(varchar(10),h.lastrundate,120),convert(varchar(10),getdate(),120)) = 3)
            or lastrundate is null))
        or ([runinterval] = 'W'
            and (convert(varchar(10),nextrundate,120) = convert(varchar(10),getdate(),120)
            and datepart(day,getdate()) = 5
            and (datediff(week,convert(varchar(10),h.lastrundate,120),convert(varchar(10),getdate(),120)) = 1)
            or lastrundate is null)) 
        or ([runinterval] = 'O'
            and (convert(varchar(10),nextrundate,120) = convert(varchar(10),getdate(),120)
            and (datepart(weekday,getdate()) = 0))
            or lastrundate is null))

PATIENTLETTERS_SCRIPTHISTとからリストされた特定の列を選択しようとしていることはわかっていますPATIENTLETTERS_SCRIPTS。私が混乱したクエリの部分は、次のような行です。

            and (([runinterval] = 'M'
            and (convert(varchar(10),nextrundate,120) = convert(varchar(10),getdate(),120)
            and datepart(day,getdate()) = 5
            and (datediff(month,convert(varchar(10),h.lastrundate,120),convert(varchar(10),getdate(),120)) = 1)

誰かがそれらの行が実際に何をしているのかを説明できれば、私はどんな助けにも感謝します. 実行間隔が「M」であることを確認したいことがわかります.4行目で現在の日付をデータベースに格納されている日に一致させようとしているように見えますが、2行目と3行目はまだ完全な謎。

4

3 に答える 3

2

毎月実行するように設定されたアイテムを探しています。次の実行日は今日で、今日はその月の5日であり、アイテムが最後に実行されてからちょうど1か月です。

于 2012-07-13T13:15:54.697 に答える
1

2行目は、スタイル120(詳細はこちらnextrundate)を使用して現在の日付を「YYYY-MM-DD」形式に変換し、それらが同じであることを確認します。したがって、今日の行のみです。nextrundate

3行目は、今日がその月の5日であることを確認するだけです。例: SELECT DATEPART(DAY, '2012-07-05')5を返します。

于 2012-07-13T13:16:38.997 に答える
1

このコードは、runinterval = 'M'

line 1 - [runinterval] = 'M'

が現在の日付 ( ) と等しい場合、日付は同じ形式の varchar に変換nextrundateされますgetdate()

line 2 - and (convert(varchar(10),nextrundate,120) = convert(varchar(10),getdate(),120)

現在の日付の 1 日は 5 です。つまり、日付は 6 月 5 日、7 月 5 日などである必要があります。

line 3 - and datepart(day,getdate()) = 5

lastrundateの月と現在の日付 ( getdate())の差は1 です。

line 4 - (datediff(month,convert(varchar(10),h.lastrundate,120),convert(varchar(10),getdate(),120)) = 1)
于 2012-07-13T13:14:10.560 に答える