首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

oracle判断时间范围 <====>(参与就有分)解决思路

2012-01-31 
oracle判断时间范围 (参与就有分)我有两张表表A name,start_date,end_date表B tName,re_date表A中的

oracle判断时间范围 <====>(参与就有分)
我有两张表  
表A name,start_date,end_date  
表B tName,re_date

表A中的 值全部是固定的 

现在要查询tName 并且选中的时间 re_date 在 start_date,end_date 范围内


[解决办法]
select tName from b join a where b.re_date between a.start_date and a.end_date;
[解决办法]
...where re_date between start_date and end_date
[解决办法]
你这样写是将二个表进行了迪卡儿积了,查出来是不对的,你这两个表是有关系的吗,还是第一个表就只有一条记录
[解决办法]

SQL code
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'))
[解决办法]
SQL code
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
[解决办法]
SQL code
select t1.name, t1.start_date, t1.end_datefrom a t1where 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的逻辑详细进行解释
SQL code
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')
就是判断时间范围的条件啊

我写了个例子,楼主你可以参照看下。
SQL code
 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 unionselect'xiaob',      to_date('2010-3-2','yyyy-mm-dd'),   to_date('2010-4-2','yyyy-mm-dd') from dual unionselect'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,bwhere b.tname = a.name and      b.re_date between a.start_date and a.end_date;
[解决办法]
探讨
我有两张表
表A name,start_date,end_date
表B tName,re_date

表A中的 值全部是固定的

现在要查询tName 并且选中的时间 re_date 在 start_date,end_date 范围内

[解决办法]
探讨
re_date 是用控件dateTimePicker1的值,要判断 当name=tName 时这个时间是否在start_date,end_date范围内,


start_date,end_date 格式也是date类型的数据,并且数据库中start_date,end_date有值


[解决办法]
既然都知道了re_date 为什么不直接引用啊 也许我没有看懂LZ的意思
[解决办法]
如果你数据库中的re_date存储的值的时分秒部分不为0,需要去除时分秒判断。
假设数据库中re_date的值是 2011-9-16 12:01:52
那么 re_date = to_date('2011-9-16','yyyy-mm-dd')的结果为"假",
使用trunc()函数去除时分秒后再判断就可以了:
trunc(re_date) = to_date('2011-9-16','yyyy-mm-dd')的结果为"真",

热点排行