SQL между датами, где окончание может быть нулевым - PullRequest
0 голосов
/ 23 октября 2019

Я работаю над оператором SQL, в котором я ищу дату начала и дату окончания между диапазонами. Единственная проблема, с которой я сталкиваюсь - это конец, который не был обновлен и является нулевым. Я пытаюсь добавить текущую дату в это поле в примере

Если я сделаю это, я должен увидеть последние две строки, которые я не вижу в данный момент.

(CAST(StartDate AS Date) >= '2019-08-22') AND ((CAST(EndDate AS Date) <= '2019-08-22') or (EndDate IS NULL))

Таблица данных

    StartDate               EndDate
    2017-07-18 14:40:00.000 2017-10-13 16:29:09.723
    2017-10-13 16:29:09.723 2017-10-27 10:36:55.990
    2017-10-27 10:36:55.990 2017-12-12 15:01:51.600
    2017-12-12 15:01:51.600 2018-01-24 15:08:53.637
    2018-01-24 15:08:53.637 2018-04-04 10:56:27.110
    2018-04-04 10:56:27.110 2018-05-25 14:14:13.863
    2018-05-25 14:14:13.863 2018-05-25 14:41:16.033
    2018-05-25 14:41:16.033 2018-10-17 15:45:58.517
    2018-10-17 15:45:58.517 2018-12-18 11:33:37.663
    2018-12-18 11:33:37.663 2019-02-11 11:22:52.053
    2019-02-11 11:22:52.053 2019-08-21 10:40:17.937
    2019-08-21 10:40:17.937 2019-08-21 10:40:25.343
    2019-08-21 10:40:25.343 NULL

Ответы [ 3 ]

3 голосов
/ 23 октября 2019

Если вы хотите использовать МЕЖДУ, попробуйте выполнить ISNULL или COALESCE внутри CAST.
Предполагая, что EndDate является полем даты и времени.

 AND '2019-08-22' BETWEEN CAST(Version.StartDate AS DATE) AND CAST(COALESCE(Version.EndDate, GETDATE()) AS DATE)
1 голос
/ 23 октября 2019

Используйте правильную дату и NULL логику. Вышеприведенное не совсем соответствует полной картине, но это должно показать вам, что делать:

WHERE DateColumn >= '20190101'
  AND (DateColumn < '20191024'
   OR  DateColumn IS NULL)

Это вернет все строки, где DateColumn включено или после 01 января 2019 года и до , но не включая 24 октября 2019 года или NULL.

Я лично предпочитаю метод >= AND <, поскольку даты могут включать в себя время. Значение типа 2019-10-23T00:00:00.003 не равно <= '20191023' (это спустя 3 миллисекунды). Точно так же, если бы вы использовали 20191024 в качестве верхней границы и использовали <=, тогда вы могли бы получить нежелательные строки, которые встречаются точно в 2019-10-24T00:00:00.000.


На основе OPДля выборочных данных, на самом деле кажется, что они хотят логического аннулирования:

WHERE DateColumn <= '20191024'
  AND (DateColumn > '20190101'
   OR  DateColumn IS NULL)

Это вернет любую строку, которая была «активной» в любую дату в период с 01 января 2019 года по 23 октября 2019 года включительно.

1 голос
/ 23 октября 2019

Синтаксис, который вам, скорее всего, нужен, выглядит следующим образом:

WHERE '2019-08-22' >= StartDate AND ('2019-08-22' <= EndDate OR EndDate IS NULL)

Приведенное выше условие вернет true для любой входной даты, ограниченной ниже StartDate и выше EndDate или, если EndDate отсутствует (т. Е. NULL), это также удовлетворяет критериям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...