日期:2014-05-16 浏览次数:21238 次
select name,start_date,end_date,tName,re_date from A,B where to_char(re_date,'yyyy-mm-dd') between to_char(start_date,'yyyy-mm-dd') and to_char(end_date,'yyyy-mm-dd') and to_char(re_date,'yyyy-mm-dd') ='2011-3-23'
------解决方案--------------------
如果你的二个表的名字是有关系的话用下面这个语句试一下,是下查询出有效期内的名字,再根据这个名字查询B的数据
select * from B B where tName in(select name from A A where to_char(B.re_date,'yyyy-mm-dd') between to_char(A.start_date,'yyyy-mm-dd') and to_char(A.end_date,'yyyy-mm-dd'))
------解决方案--------------------
select name,start_date,end_date,tName,re_date from A,B where to_date(re_date,'yyyy-mm-dd') between to_date(start_date,'yyyy-mm-dd') and to_date(end_date,'yyyy-mm-dd') and name = tname
------解决方案--------------------
select t1.name, t1.start_date, t1.end_date from a t1 where exists (select 1 from b t2 where t2.tName=t1.name and t2.re_date>=t1.start_date and t2.re_date<=t1.end_date );
------解决方案--------------------
to_char(re_date, 'yyyy-mm-dd') = '2011-09-16'
------解决方案--------------------
我给你的SQL逻辑上应当是没问题的,下面我就SQL的逻辑详细进行解释
select name,start_date,end_date,tName,re_date from A,B -- 此处笛卡尔乘积,表A的每一条记录与表B的每一条记录进行交叉 where -- 此处过滤所有符合条件的记录,去除不符合条件的记录 --这部分条件是去除时间眼中出范围的记录 to_date(re_date,'yyyy-mm-dd') between to_date(start_date,'yyyy-mm-dd') and to_date(end_date,'yyyy-mm-dd') -- 这部分条件是去除人名不相等的记录 and name = tname
------解决方案--------------------
没有少条件啊
to_date(re_date,'yyyy-mm-dd') between to_date(start_date,'yyyy-mm-dd') and to_date(end_date,'yyyy-mm-dd')
就是判断时间范围的条件啊
我写了个例子,楼主你可以参照看下。
with a as ( select'xiaoa' name, to_date('2009-10-1','yyyy-mm-dd') start_date, to_date('2020-9-1','yyyy-mm-dd') end_date from dual union select'xiaob', to_date('2010-3-2','yyyy-mm-dd'), to_date('2010-4-2','yyyy-mm-dd') from dual union select'xiaoc', to_date('2011-11-2','yyyy-mm-dd'), to_date('2011-12-9','yyyy-mm-dd') from dual ), b as ( select 'xiaoa' tname, to_date('2011-9-16','yyyy-mm-dd') re_date from dual ) -- 上面部分是定义虚表,下面部分是实际的SQL语句 select name,start_date,end_date,tName,re_date from a,b where b.tname = a.name and b.re_date between a.start_date and a.end_date;
------解决方案--------------------