2010-07-02 7 views

Répondre

4

Cela montre comment

with cc as(
select to_date('12-jan-1999') as cdate from dual union all 
select to_date('12-jan-1921') as cdate from dual union all 
select to_date('12-jan-1900') as cdate from dual union all 
select to_date('12-jan-2000') as cdate from dual union all 
select to_date('12-jan-2010') as cdate from dual 
) 
select to_date(to_char(cdate,'DD-MON') ||'-2011','DD-MON-YYYY') 
from cc 
where cdate < to_date('01-JAN-2010','DD-MON-YYYY') 
/
+0

J'aime ça. J'aime beaucoup ça. Donnez-moi quelques minutes pour le tester. – jake

+1

Cela se brisera un jour par an sur les années bissextiles. ADD_MONTHS est une solution plus robuste. – Allan

3

1 an = 12 mois, donc il faut soustraire 12 mois:

select add_months(sysdate,-12) from dual 
1

Voici comment faire si cela fonctionne avec les années bissextiles en utilisant ADD_MONTHS.

with cc as( 
select to_date('12-jan-1999','dd-mon-yyyy') as cdate from dual union all 
select to_date('12-jan-1921','dd-mon-yyyy') as cdate from dual union all 
select to_date('29-feb-1904','dd-mon-yyyy') as cdate from dual union all 
select to_date('12-jan-2000','dd-mon-yyyy') as cdate from dual union all 
select to_date('12-jan-2010','dd-mon-yyyy') as cdate from dual 
) 
select add_months(cdate,(2011 - extract(year from cdate)) * 12) 
from cc 
where cdate < to_date('01-JAN-2010','DD-MON-YYYY');