我有以下问题。我有一个系统每天每小时运行的检查列表。它知道要运行哪个检查,因为它们在数据库中。现在我做了一个不同的表,在这里我可以为每个应用程序设置维护窗口。我遇到了以下问题。
我加入应用程序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年或是什么时候,日期是空的,但应该有一个更干净的选择,对吗?
2条答案
按热度按时间o4tp2gmn1#
我想你应该把条件转移到
ON
条款:这将返回中的所有行
checks
以及来自maintenance
.c7rzv4ha2#
查询结果将是checks表中的所有行,只有maintenance表中按appid匹配的行。
如果您只需要维护这些检查,那么只需将连接更改为内部连接。还是我误解了?
如果您想要的是所有检查,并且只有维护中属于日期范围的那些行,那么您可以在where子句中附加一个is null