Oracle SQL TOAD - 根据Sysdate更新变量(Concat字符串+年份)中的年份

时间:2015-05-05 16:02:12

标签: sql oracle date concatenation

我想根据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')

1 个答案:

答案 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

SQLFiddle demo

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只是使用这些日期收集数据。