sql不在日期之间(包括null)

zdwk9cvp  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(303)

我有以下问题。我有一个系统每天每小时运行的检查列表。它知道要运行哪个检查,因为它们在数据库中。现在我做了一个不同的表,在这里我可以为每个应用程序设置维护窗口。我遇到了以下问题。
我加入应用程序id上的维护窗口表。如下所示:

Select check.appid, check.query, maint.appid 
from checks as check 
left join maintenance as maint on maint.appid = check.appid

在那之后,我想添加一个where子句,结果是

Select check.appid, check.query, maint.appid 
from checks as check 
left join maintenance as maint on maint.appid = check.appid

WHERE
SYSDATETIMEOFFSET()
            BETWEEN 
            CONVERT(DATETIMEOFFSET,maint.StartDateTime AT TIME ZONE maint.[TimeZone]) 
            AND 
            CONVERT(DATETIMEOFFSET,maint.EndDateTime AT TIME ZONE maint.[TimeZone]);

这将返回一个包含当前正在维护的应用程序的列表,因此is不应运行检查。
我试着让它成为一个非中间人。但这使我最终没有任何记录,因为当没有维护时,start和enddate将在join上返回null。
一个肮脏的修正可能是强制日期在1990年或是什么时候,日期是空的,但应该有一个更干净的选择,对吗?

o4tp2gmn

o4tp2gmn1#

我想你应该把条件转移到 ON 条款:

select c.appid, c.query, m.appid 
from checks c left join
     maintenance m
     on m.appid = c.appid and
        SYSDATETIMEOFFSET() not between 
            CONVERT(DATETIMEOFFSET, maint.StartDateTime AT TIME ZONE maint.[TimeZone]) AND
            CONVERT(DATETIMEOFFSET,maint.EndDateTime AT TIME ZONE maint.[TimeZone]);

这将返回中的所有行 checks 以及来自 maintenance .

c7rzv4ha

c7rzv4ha2#

查询结果将是checks表中的所有行,只有maintenance表中按appid匹配的行。
如果您只需要维护这些检查,那么只需将连接更改为内部连接。还是我误解了?

Select check.appid, check.query, maint.appid 
from checks as check 

**inner**join maintenance as maint on maint.appid = check.appid

WHERE
SYSDATETIMEOFFSET()
            BETWEEN 
            CONVERT(DATETIMEOFFSET,maint.StartDateTime AT TIME ZONE maint.[TimeZone]) 
            AND 
            CONVERT(DATETIMEOFFSET,maint.EndDateTime AT TIME ZONE maint.[TimeZone]);

如果您想要的是所有检查,并且只有维护中属于日期范围的那些行,那么您可以在where子句中附加一个is null

Select check.appid, check.query, maint.appid 
from checks as check 
left join maintenance as maint on maint.appid = check.appid

WHERE

**maint.appid IS NULL OR**

SYSDATETIMEOFFSET()
            BETWEEN 
            CONVERT(DATETIMEOFFSET,maint.StartDateTime AT TIME ZONE maint.[TimeZone]) 
            AND 
            CONVERT(DATETIMEOFFSET,maint.EndDateTime AT TIME ZONE maint.[TimeZone]);

相关问题