Oracle中的日期范围查询

时间:2014-04-07 16:43:33

标签: sql oracle

我有以下数据

Sr. FromDate ToDate Code

1   1990-01-01  2000-08-31  A        
2   2000-09-01  2001-05-31  B        
3   2001-06-01  2018-12-31  C        

并且需要编写SQL查询来查找具有代码的行 date range = fromdate 1992-01-01 and ToDate 2000-12-31。

Select * 
From Table 
Where fromDate <= 1992-01-01 
and EndDate >=2000-12-31

没有返回正确的数据。

任何帮助??

预期输出是前两行,涵盖查询中提到的部分日期。


可能的查询之一是:

选择*来自fromdate&lt; = 19920101的表格 联盟 选择*来自表格,其中todate&gt; = 20011231

但有些我不喜欢它,想要更方便的选择。

4 个答案:

答案 0 :(得分:0)

切换运算符

select * 
from Table 
where fromDate >= '1992-01-01'
and EndDate <= '2000-12-31'

答案 1 :(得分:0)

您应该将数据迁移到日期对象:

Select *
from table
where fromDate >= to_date('1992-01-01','YYYY-MM-DD') 
and ...

在此处查看有效的日期格式和语法: http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions183.htm

答案 2 :(得分:0)

尝试反向过滤,我的意思是更改过滤日期:

WITH tab(ID, start_date, end_date, code) AS (
    SELECT 1, to_date('1990-01-01', 'YYYY-MM-DD'), to_date('2000-08-31', 'YYYY-MM-DD'), 'A' FROM dual UNION ALL        
    SELECT 2, to_date('2000-09-01', 'YYYY-MM-DD'), to_date('2001-05-31', 'YYYY-MM-DD'), 'B' FROM dual UNION ALL
    SELECT 3, to_date('2001-06-01', 'YYYY-MM-DD'), to_date('2018-12-31', 'YYYY-MM-DD'), 'C' FROM dual)
-----------------
--End of data preparation
-----------------
SELECT * 
  FROM tab
 WHERE end_date >= to_date('1992-01-01', 'YYYY-MM-DD') 
   AND start_date <= to_date('2000-12-31', 'YYYY-MM-DD');

输出

| ID |                       START_DATE |                      END_DATE | CODE |
|----|----------------------------------|-------------------------------|------|
|  1 |   January, 01 1990 00:00:00+0000 | August, 31 2000 00:00:00+0000 |    A |
|  2 | September, 01 2000 00:00:00+0000 |    May, 31 2001 00:00:00+0000 |    B |

答案 3 :(得分:0)

根据你的说法,你必须提出一个OR。这真的是你需要的吗?

Select *
From Table 
Where fromDate <= '1992-01-01'
OR EndDate >='2000-12-31'