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号,并且距离项目上次运行正好一个月。

于 2012-07-13T13:15:54.697 回答
1

此代码正在寻找具有runinterval = 'M'

line 1 - [runinterval] = 'M'

并且nextrundate等于当前日期 ( getdate()),日期将被转换为具有相同格式的 varchar。

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

并且当前日期的一天等于 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 回答
1

第二行使用样式 120(此处有更多详细信息nextrundate)将当前日期转换为“YYYY-MM-DD”格式,然后检查它们是否相同,因此只有今天所在的行。nextrundate

第三行只是检查今天是一个月的第 5 天。例如: SELECT DATEPART(DAY, '2012-07-05')返回 5。

于 2012-07-13T13:16:38.997 回答