Выберите плохо используемые начальные и конечные даты из таблицы объекта - PullRequest
2 голосов
/ 08 октября 2008

Я использую DB2, хотя решение, использующее любую разновидность SQL, скорее всего, мне будет достаточно легко конвертировать.

Я не проектировал эту базу данных или приложение, которое использует базу данных. У меня нет полномочий изменить это приложение, его работу или данные. Поскольку это противоречит тому, что я считаю обычным использованием начальной и конечной даты, я пытаюсь написать что-то столь же простое, как выбор для определенного момента времени.

Вот соответствующие / отредактированные части таблицы:

OBJECTID    FACILITY_ID     START_DATE      END_DATE    FACILITY_NAME
1001        500             1/1/1980        5/1/2000    Really Old Name
1002        500             1/1/1980        1/1/2006    Old Name
1003        500             1/1/1980        null        Current Name
1004        501             1/1/1980        3/1/2008    Closed Facility Name
1004        502             1/1/1980        null        Another Current Name

То, что я хочу вернуть, это записи, которые действительны на 01.07.2005:

OBJECTID    FACILITY_ID     START_DATE      END_DATE    FACILITY_NAME
1002        500             1/1/1980        1/1/2006    Old Name
1004        501             1/1/1980        3/1/2008    Closed Facility Name
1004        502             1/1/1980        null        Another Current Name

Я пытаюсь избежать подвыборов, но понимаю, что они могут быть необходимы. Если мне нужен отбор, я бы хотел, чтобы он был ограничен одним. Просмотр между начальной и конечной датой не работает, потому что он не возвращает объекты, которые имеют только одну запись с нулевой конечной датой. Добавление условия ИЛИ для включения конечных дат, которые являются нулевыми, может возвращать более одной записи в некоторых случаях. Эта проблема кажется настолько простой в сервисе, что я, должно быть, упускаю смехотворно очевидное решение. У кого-нибудь есть идеи?

Ответы [ 6 ]

2 голосов
/ 08 октября 2008

будет работать:

SELECT * FROM table_name
WHERE START_DATE < '7/1/2005' AND (END_DATE > '7/1/2005' OR END_DATE IS NULL);
1 голос
/ 08 октября 2008

Извините, что отвечаю на мой вопрос. Спасибо всем, ответы были очень полезны. Также было полезно подумать о том, чего именно я пытался достичь. Объединяя концепции из ответов, которые были даны, я смог придумать что-то, что, кажется, работает:

SELECT 
    * 
FROM 
    FACILITY_TABLE
WHERE 
    (END_DATE IS NULL
     AND OBJECTID NOT IN 
     (SELECT A.OBJECTID FROM FACILITY_TABLE A 
     WHERE '7/1/2005' BETWEEN A.BEGINDATE AND A.ENDDATE))
  OR 
    '7/1/2005' BETWEEN FACILITY_TABLE.START_DATE AND FACILITY_TABLE.ENDDATE

Поскольку дата начала была сделана бессмысленной данными, я не включил ее. Возвращает только те записи, которые были действительны в период с 01.07.2005, без учета текущей записи, если срок действия записи истек между настоящим и моментом.

1 голос
/ 08 октября 2008

дубль 2:

select OBJECTID, FACILITY_ID, START_DATE, FACILITY_NAME, MIN(END_DATE) as  END_DATE
from facitities
where START_DATE <= @my_date and (@mydate <= END_DATE or END_DATE is null)
group by OBJECTID, FACILITY_ID, START_DATE, FACILITY_NAME
1 голос
/ 08 октября 2008

Хитрость в том, чтобы объединить дату окончания на следующий день, :) Coalesce в основном заменяет нулевое значение вторым параметром. Довольно крутой трюк.

select * from TAble where START_DATE < @DATE and Coalesce(END_DATE, @DATE+1) > @DATE
0 голосов
/ 24 декабря 2008

Небольшое отклонение от приведенного выше:

select * from facilities
where @my_date between START_DATE AND COALESCE(END_DATE, CURRENT DATE)
0 голосов
/ 08 октября 2008

Из того, что вы нам дали, это то, что вы хотите:

select * from facitities
where START_DATE <= @my_date and (@mydate <= END_DATE or END_DATE is null)

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

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