0
votes

Combinaison d'add_months et to_date a mal tourné si la date est le 28-février

J'essaie d'obtenir une date de 16 jours avant de 6 mois + date donnée code>. Maintenant c'est une tâche simple. J'ai créé une requête pour obtenir le résultat. Mais hier, j'ai entré le 28 février 2019 et la réponse a mal tournée. J'ai essayé de trouver une solution mais j'ai échoué. Alors s'il vous plaît, aidez-moi à sortir, je fournis deux requêtes SPAPERATE pour trouver la réponse.

SELECT TO_CHAR(TO_DATE(ADD_MONTHS(TO_DATE(:P2_JOIN_DT,'DD-MON-RRRR'),6)-16)) FROM DUAL;


6 commentaires

Son fonctionnement fine Select to_char (Add_Months (to_Date ('28 -Feb-19 '', 'DD-Mon-RRRR') - 16,6)) Dual; Donne 12-août 19 Sélectionnez TO_CHAR (add_months (TO_Date ('28 -Mar-19 ',' DD-MON-RRRR ') - 16,6)) de Dual; 12-Sep-19


Ajouter un nombre de mois est pas une tâche simple parce que cela dépend de ce que vous entendez par cela. Il y a des cas de bord (en particulier avec des dates au cours des derniers jours d'un mois, et surtout avec des dates telles que 28 et 29 février au début des années) où "ajouter un mois" est ambiguë. Plus précisément, la réponse sera potentiellement différente selon que vous ajoutez les mois suivis d'abord en ajoutant les jours, ou si vous ajoutez les jours, puis ajoutez les mois.


Par exemple, Date'2000-02-28 '+ 6 mois se traduit par 28/8/2000, alors que la date de 2001-02-28' + 6 mois se traduit par 31/8/2001. Il n'y a pas de réponse simple "droite", cela dépend simplement de votre définition des exigences.


Vos deux questions donnent des résultats différents de toute façon; 2019-03-01 devient soit 2019-08-13 ou 2019-08-16. Vous devez définir ce que vous voulez réellement arriver.


J'ai modifié la question, veuillez vérifier, vous comprendrez donc mon scénario actuel.


Après votre édition, je pense que l'approche fonctionnera; Si cela ne pouvez pas vous expliquer pourquoi?


4 Réponses :


0
votes

"6 mois + date de date" est xxx pré>

"16 jours avant de 6 mois + date donnée em>" est p> xxx

Par exemple: P>

SQL> select add_months(date '2019-02-28', 6) - 16 res1,
  2         add_months(date '2019-03-28', 6) - 16 res2
  3  from dual;

RES1       RES2
---------- ----------
15.08.2019 12.09.2019

SQL>


4 commentaires

Essayez 28 février puis essayez des valeurs de 28-mar étaient assez différentes.


Les valeurs doivent être différentes, n'est-ce pas? J'ai ajouté un exemple. Si ce n'est pas correct, pourriez-vous poster quelques exemples comme paires de date donnée: résultat souhaité qui pourrait nous aider à vous aider?


Prendre soin de 6 mois de 28 févr. 28 août à droite? Donc, 16 jours avant le 28 août seront 12 août!


Tort. 6 mois après le 28 février est 31-août , pas 28 août. Voici comment add_months fonctionne, voir la documentation. "Si la date est le dernier jour du mois ou si le mois résultant a moins de jours que la composante de la journée de la date, le résultat est le dernier jour du mois résultant" ( docs.oracle.com/cd/b19306_01/server.102/b14200/fonctions004 .htm )



0
votes

oracle Documentation :

Si la date est le dernier jour du mois (...), le résultat est le dernier jour du mois résultant. P> blockQuote>

SO: P>

select add_months(date '2019-02-28', 6) from dual


0 commentaires

1
votes

Votre première requête est soustraire 16 jours (ce qui peut vous emmener dans le mois précédent), puis ajoute six mois à ce sujet. Votre deuxième requête ajoute six mois (ce qui semble vous trébucher à la fin du mois, car d'autres ont souligné.

Vous semblez vouloir vouloir différentes requêtes à différents endroits du mois; vous pourriez donc combiner les deux calculs dans une affaire Expression: P>

P2_JOIN_DT QUERY1     QUERY2     COMBINED  
---------- ---------- ---------- ----------
2019-01-01 2019-06-16 2019-06-15 2019-06-15
2019-01-28 2019-07-12 2019-07-12 2019-07-12
2019-02-01 2019-07-16 2019-07-16 2019-07-16
2019-02-28 2019-08-12 2019-08-15 2019-08-12
2019-03-01 2019-08-13 2019-08-16 2019-08-16
2019-03-28 2019-09-12 2019-09-12 2019-09-12
2019-04-01 2019-09-16 2019-09-15 2019-09-15
2019-04-28 2019-10-12 2019-10-12 2019-10-12
2019-05-01 2019-10-15 2019-10-16 2019-10-16
2019-05-28 2019-11-12 2019-11-12 2019-11-12
2019-06-01 2019-11-16 2019-11-15 2019-11-15
2019-06-28 2019-12-12 2019-12-12 2019-12-12
2019-07-01 2019-12-15 2019-12-16 2019-12-16
2019-07-28 2020-01-12 2020-01-12 2020-01-12
2019-08-01 2020-01-16 2020-01-16 2020-01-16
2019-08-28 2020-02-12 2020-02-12 2020-02-12
2019-09-01 2020-02-16 2020-02-14 2020-02-14
2019-09-28 2020-03-12 2020-03-12 2020-03-12
2019-10-01 2020-03-15 2020-03-16 2020-03-16
2019-10-28 2020-04-12 2020-04-12 2020-04-12
2019-11-01 2020-04-16 2020-04-15 2020-04-15
2019-11-28 2020-05-12 2020-05-12 2020-05-12
2019-12-01 2020-05-15 2020-05-16 2020-05-16
2019-12-28 2020-06-12 2020-06-12 2020-06-12


0 commentaires

1
votes

Je pense éviter un tel problème, vous pouvez ajouter des mois à la date tronquée de mois et ajouter des jours à nouveau comme suit: xxx

acclamations !!


1 commentaires

- 16 , pas + 16 ? En fait, vous avez besoin d'un autre - 1 , aussi bien, puisque vous y pensez maintenant le premier jour du mois deux fois. Bien cependant.