我正在使用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的结束日期在某些情况下可能返回多个记录。这个问题在服务上似乎很简单,我必须错过一个非常明显的解决方案。有没有人有任何想法?
答案 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)