Как обновить столбец даты, изменив только год, а не день или месяц, используя PLSQL? - PullRequest
2 голосов
/ 02 июля 2010

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

Ответы [ 3 ]

5 голосов
/ 02 июля 2010

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

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')
/
3 голосов
/ 02 июля 2010

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

select add_months(sysdate,-12) from dual
1 голос
/ 02 июля 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');
...