从设施表中选择使用不良的开始日期和结束日期

时间:2008-10-08 16:36:20

标签: sql db2 logic

我正在使用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

我想要返回的是对于7/1/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

我试图避免使用子选择,但要明白它们可能是必要的。如果我确实需要一个subselect,我想将它限制为一个。在开始日期和结束日期之间查看不起作用,因为它不返回只有一个记录具有空结束日期的设施。添加OR条件以包括null的结束日期在某些情况下可能返回多个记录。这个问题在服务上似乎很简单,我必须错过一个非常明显的解决方案。有没有人有任何想法?

6 个答案:

答案 0 :(得分:2)

这会有效吗?

SELECT * FROM table_name
WHERE START_DATE < '7/1/2005' AND (END_DATE > '7/1/2005' OR END_DATE IS NULL);

答案 1 :(得分:1)

技巧是将结束日期合并到第二天,:) Coalesce基本上用第二个参数替换空值。非常酷的小技巧。

select * from TAble where START_DATE < @DATE and Coalesce(END_DATE, @DATE+1) > @DATE

答案 2 :(得分:1)

拿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

答案 3 :(得分:1)

很抱歉回答我自己的问题。谢谢大家,给出的答案非常有帮助。考虑我想要完成的事情也很有帮助。结合给出的答案中的概念,我能够提出似乎有用的东西:

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

由于数据使开始日期变得毫无意义,因此我没有将其包括在内。仅返回在7/1/2005中有效的记录,如果记录从现在开始到此之间已过期,则不包括当前记录。

答案 4 :(得分:0)

根据你给我们的信息,这就是你想要的:

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

然而,我怀疑你知道这一点,并且想要一些不同的东西,在这种情况下,你必须更加具体地了解数据的错误。

答案 5 :(得分:0)

上述情况略有不同:

select * from facilities
where @my_date between START_DATE AND COALESCE(END_DATE, CURRENT DATE)