SQL НЕ Между датами (включая NULL) - PullRequest
1 голос
/ 27 мая 2020

У меня следующая проблема. У меня есть список проверок, которые система выполняет каждый час / день. Он знает, какие проверки нужно запускать, потому что они есть в базе данных. Теперь я сделал другую таблицу, где я могу установить обслуживание windows для каждого приложения. И я столкнулся со следующей проблемой.

Я присоединяюсь к таблице окон обслуживания по идентификатору приложения. вот так:

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]);

Это возвращает список с приложениями, которые в настоящее время находятся на обслуживании, поэтому это не должно запускать проверки.

Я пытался сделать это НЕ МЕЖДУ. Но это приводит к тому, что у меня вообще нет записей, потому что, когда нет обслуживания, start и enddate вернут нулевое значение для соединения.

грязное исправление могло заключаться в том, чтобы принудительно установить дату в 1990 году или что-то в этом роде, когда дата равна нулю, но должна быть доступна более чистая опция, верно?

Ответы [ 2 ]

1 голос
/ 27 мая 2020

Я думаю, вы хотите переместить условия в предложение 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.

0 голосов
/ 27 мая 2020

По мере выполнения запроса результатами будут все строки из таблицы проверок и только те строки из таблицы обслуживания, которые соответствуют 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]);

Если вам нужны все проверки и только те строки из технического обслуживания, которые попадают в диапазон дат, вы можете добавить IS NULL в предложение where

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]);
...