2008-12-29 13 views
2

J'espère que quelqu'un pourrait m'aider à ce sujet.Ajouter une date sans dépasser un mois

Je veux ajouter un mois à une date de base de données, mais je veux empêcher deux sauts par mois ces jours-là à la fin.

Par exemple, je peux avoir:

31 janvier 2009

Et je veux obtenir

28 février 2009

et non

2 Mars 2009

La prochaine date serait

28 Mars 2009

28 juin 2009

etc.

Y at-il une fonction qui effectuent déjà ce genre d'opération dans l'oracle?

EDIT

Yeap. Je veux copier chaque mois tous les enregistrements avec un certain statut au suivant (ainsi l'utilisateur ne doit pas entrer 2 000 lignes chaque mois)

Je peux aller chercher tous les enregistrements et mettre à jour la date manuellement (bien dans un manière impérative) mais je préfère laisser le SQL faire le travail.

Quelque chose comme:

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

Mais le problème vient le dernier jour.

Une idée avant de devoir coder quelque chose comme ça?

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

Ajouter mois a fait l'affaire.

maintenant j'ai ceci:

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

Merci pour l'aide.

Répondre

11

Oracle dispose d'une fonction intégrée ADD_MONTHS qui fait exactement cela:

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 
0

Je pense que vous devrez écrire sur votre propre, Mon conseil est le premier à évaluer le « dernier jour du mois » avec cette méthode:

  • Ajouter un mois (pas 30 jours, un mois!)
  • Rechercher le premier jour du mois (devrait être facile)
  • substract un jour

comparer ensuite à votre valeur « plus x jours », et choisissez la plus faible (je compris la logique derrière le saut du 31 janvier au 28 février, mais je ne l'obtiens pas pour le saut du 28 février au 28 mars)

0

On dirait que vous voulez le mois en cours plus un (avec le roulement approprié en décembre

et le minimum du dernier jour de ce mois et du jour en cours.

1

Je viens de faire: sélectionnez ADD_MONTHS (TO_DATE ('30 -DEC-08' ​​), 2) de double

et obtenu 28-FEB-2009

Pas besoin d'utiliser LAST_DAY. Si vous avez suivi cette route, vous pouvez créer une fonction qui: 1. prend une date 2. Modifie le jour au premier jour du mois. 3. Ajoutez un mois. 4. Modifie le jour à LAST_DAY pour ce mois.

Questions connexes