我想根据Sysdate
更新变量(字符串+年份)我想或多或少地执行'select'命令:
如果sysdate
介于 10月1日和 12月31日
select * from table where table.date between CONCAT
('1/10/','Variable_Year_Current' )AND CONCAT
('30/09/','Variable_Year+1')
如果sysdate
介于 1月1日和 9月30日之间
select * from table
where table.date
between CONCAT ('1/10/','Variable_Year-1' )
AND CONCAT ('30/09/','Variable_Year_Current')
答案 0 :(得分:1)
此查询适用于测试数据:
with
a as (select 1970 var, to_char(sysdate, 'mm-dd') today from dual),
b as (select case when today between '10-01' and '12-31'
then to_date(var ||'-10-01', 'yyyy-mm-dd')
else to_date(var-1||'-10-01', 'yyyy-mm-dd') end d1,
case when today between '10-01' and '12-31'
then to_date(var+1||'-09-30', 'yyyy-mm-dd')
else to_date(var ||'-09-30', 'yyyy-mm-dd') end d2
from a)
select test.* from b, test
where tdate between b.d1 and b.d2
1970年第一线改为“变量”年。
'2015 var'不得由我自己定义。 'year var'应该由sysdate定义。
你的意思是变量并不十分清楚。您可以使用extract(year from sysdate)
:
with
a as (select extract(year from sysdate) var,
to_char(sysdate, 'mm-dd') today from dual),
b as (select case when today between '10-01' and '12-31'
then to_date(var ||'-10-01', 'yyyy-mm-dd')
else to_date(var-1||'-10-01', 'yyyy-mm-dd') end d1,
case when today between '10-01' and '12-31'
then to_date(var+1||'-09-30', 'yyyy-mm-dd')
else to_date(var ||'-09-30', 'yyyy-mm-dd') end d2
from a)
select test.* from b, test
where tdate between b.d1 and b.d2
WITH clause是所谓的子查询因子, 我经常使用它来使步骤更具可读性,并且当我需要重复引用相同的数据时。 除了我们没有“创建”物理表之外,你写的所有东西都是正确理解的, 这个工作就像子查询一样。
子查询'a'准备数据(年份和今天的日期为'MM-DD')以便进一步治疗,
子查询b
根据问题的逻辑得到最大和最小周期日期,
最后select
只是使用这些日期收集数据。