我在数据库中有以下表格tbl,我有动态加入日期1-1-2012,我希望这个日期介于(秋季和春季)或(春季和夏季)或(夏季和秋季)之间。我想查询我只通过了在Oracle中返回semestertime和加入日期的加入日期。
Semestertime joiningDate
Fall 10-13-2011
Spring 2-1-2012
Summer 6-11-2012
Fall 10-1-2015
答案 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,了解比较这些解决方案的实时演示。