获取日期之间的日期范围

时间:2014-12-09 18:01:25

标签: sql oracle

我在数据库中有以下表格tbl,我有动态加入日期1-1-2012,我希望这个日期介于(秋季和春季)或(春季和夏季)或(夏季和秋季)之间。我想查询我只通过了在Oracle中返回semestertime和加入日期的加入日期。

Semestertime        joiningDate
Fall            10-13-2011 
Spring          2-1-2012
Summer          6-11-2012
Fall            10-1-2015

2 个答案:

答案 0 :(得分:0)

如果我理解你的问题:

SELECT *
FROM your_table
WHERE joiningDate between to_date (your_lower_limit_date_here, 'mm-dd-yyyy')
AND to_date (your_upper_limit_date_here, 'mm-dd-yyyy`);

答案 1 :(得分:0)

这样的事情:

select 'BEFORE' term,
        t."Semestertime", to_char(t."joiningDate", 'MM-DD-YYYY')
from (
  select tbl.*, rownum rn from tbl where tbl."joiningDate" < to_date('1-1-2012','MM-DD-YYYY')
  --                                                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  --                                                           your reference date
  order by tbl."joiningDate" desc) t
where rn = 1

union all

select 'AFTER' term,
        t."Semestertime", to_char(t."joiningDate", 'MM-DD-YYYY')
from (
  select tbl.*, rownum rn from tbl where tbl."joiningDate" > to_date('1-1-2012','MM-DD-YYYY')
  --                                                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  --                                                           your reference date

  order by tbl."joiningDate" asc) t
where rn = 1

这将在给定日期之前和之后返回“术语”。您可能必须根据您的特定需求调整此类查询。但这可能是一个很好的起点。

例如,根据您的业务规则,您可以考虑使用<=代替<。您可能需要让结果显示列而不是行。所有这一切都不应该太改变。


作为使用CTE和子查询的替代解决方案:

with testdata as (select to_date('1-1-2012','MM-DD-YYYY') refdate from dual)

select v.what, tbl.* from tbl join
(
  select 'BEFORE' what, max(t1."joiningDate") d
  from tbl t1
  where t1."joiningDate" < to_date('1-1-2012','MM-DD-YYYY')

  union all

  select 'AFTER' what, min(t1."joiningDate") d
  from tbl t1
  where t1."joiningDate" > to_date('1-1-2012','MM-DD-YYYY')
) v
on tbl."joiningDate" = v.d

请参阅http://sqlfiddle.com/#!4/c7fa5/15,了解比较这些解决方案的实时演示。