У меня есть таблица базы данных, содержащая записи кредитных карт. Одним из полей является поле даты. Я хотел бы обновить это поле, изменив год в дате на 2011, если год меньше 2010. Из того, что я нашел, PLSQL имеет функции для времени и месяцев, но не имеет ничего общего с годами (насколько мне известно).
Как обновить столбец даты, изменив только год, а не день или месяц, используя PLSQL?
Ответы (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
Мне это нравится. Мне это очень нравится. Дайте мне несколько минут, чтобы проверить это.
- person jake; 02.07.2010
Это сломает один день в году в високосные годы. 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