Добавить дату, не превышая месяц - PullRequest
2 голосов
/ 29 декабря 2008

Я надеюсь, что кто-то может мне помочь в этом.

Я хочу добавить месяц к дате базы данных, но я хочу, чтобы в конце этих дней в конце этих дней не было двух скачков за месяц.

Например, у меня может быть:

31 января 2009

И я хочу получить

28 февраля 2009

а не

2 марта 2009

Следующая дата будет

28 марта 2009

28 июня 2009

и т.д..

Есть ли функция, которая уже выполняет такую ​​операцию в Oracle?

EDIT

Yeap. Я хочу копировать каждый месяц все записи с некоторым статусом на следующий (чтобы пользователю не приходилось вводить снова 2000 строк каждый месяц)

Я могу получить все записи и обновить дату вручную (ну обязательно), но я бы предпочел, чтобы SQL выполнил эту работу.

Что-то вроде:

insert into the_table 
select f1,f2,f3, f_date + 30 /* sort of ... :S */  from the_Table where date > ? 

Но проблема наступает с последним днем.

Есть идеи, прежде чем мне придется что-то вроде этого кодировать?

for each record in 
   createObject( record )
   object.date + date blabala
   if( date > 29 and if februrary and the moon and the stars etc etc 9 

end 

update....  et

EDIT: 2

Добавить месяцы сделали свое дело.

теперь у меня просто так:

insert into my_table
select f1, add_months( f2, 1 ) from my_table where status = etc etc 

Спасибо за помощь.

Ответы [ 5 ]

11 голосов
/ 29 декабря 2008

Oracle имеет встроенную функцию ADD_MONTHS , которая делает именно это:

SQL> select add_months(date '2008-01-31',1) from dual;

ADD_MONTHS(
-----------
29-FEB-2008

SQL> select add_months(date '2008-02-29',1) from dual;

ADD_MONTHS(
-----------
31-MAR-2008
2 голосов
/ 29 декабря 2008
1 голос
/ 29 декабря 2008

Я только что сделал: выберите add_months (TO_DATE ('30 -DEC-08 '), 2) из ​​двойного

и получил 28-FEB-2009

Нет необходимости использовать LAST_DAY. Если вы пошли по этому пути, вы могли бы создать функцию, которая: 1. принимает дату 2. Изменяет день на первый месяц. 3. Добавьте месяц. 4. Изменяет день на LAST_DAY для этого месяца.

0 голосов
/ 29 декабря 2008

Звучит так, как будто вы хотите текущий месяц плюс один (с соответствующим переносом в декабре)

и минимум последнего дня этого месяца и текущего дня.

0 голосов
/ 29 декабря 2008

Я думаю, вам придется написать это самостоятельно. Мой совет - сначала оценить «последний день месяца» с помощью этого метода:

  • Добавьте один месяц (не 30 дней, а один месяц!)
  • Найти первый день месяца (должно быть легко)
  • вычитать один день

Затем сравните его с вашим значением «плюс x дней» и выберите самое низкое (я понял логику перехода от 31 / января до 28 / февраля, но я не получил его для перехода от 28- С февраля по 28 марта)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...