Как обновить столбец даты, изменив только год, а не день или месяц, используя PLSQL?

У меня есть таблица базы данных, содержащая записи кредитных карт. Одним из полей является поле даты. Я хотел бы обновить это поле, изменив год в дате на 2011, если год меньше 2010. Из того, что я нашел, PLSQL имеет функции для времени и месяцев, но не имеет ничего общего с годами (насколько мне известно).


person jake    schedule 02.07.2010    source источник


Ответы (3)


Это показывает, как

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')
/
person josephj1989    schedule 02.07.2010
comment
Мне это нравится. Мне это очень нравится. Дайте мне несколько минут, чтобы проверить это. - person jake; 02.07.2010
comment
Это сломает один день в году в високосные годы. ADD_MONTHS — более надежное решение. - person Allan; 02.07.2010

1 год = 12 месяцев, поэтому вычтите 12 месяцев:

select add_months(sysdate,-12) from dual
person Pop    schedule 02.07.2010

Вот как это сделать, чтобы он работал с високосными годами, используя 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');
person Daniel Emge    schedule 02.07.2010