Forum Programmation.SQL Fonction qui vérifie la date ou retourne NULL ou DEFAULT s

Posté par  . Licence CC By‑SA.
Étiquettes :
0
6
juil.
2016

Bonjour,
Je cherche une fonction qui vérifie la date et retourne un défaut ou null si la date n'est pas valable.
Car j'ai un problème avec SQL qui me sort l'erreur suivante: ORA-01848: day of year must be between 1 and 365 (366 for leap year)

Ainsi j'ai crée le petit code suivant :
DECODE(DATASTREAM.P1EFTJ,0,0,to_number(to_char(user::jdatetimeToCalendar(DATASTREAM.P1EFTJ),'YYYYMMDD')))

Ce que je souhaiterai c'est dire à cette fonction que lorsque le jour n'est pas compris entre 1 et 366 alors il sort une valeur null.

Merci d'avance pour votre aide

  • # WHERE STR_TO_DATE(ta_date, '%d/%m/%Y') IS NOT NULL

    Posté par  . Évalué à 2. Dernière modification le 06 juillet 2016 à 15:10.

    tout est dans le titre

    ça ne vérifie pas spécifiquement le jour, mais l'ensemble de la date, je pense que ça retourne NULL même avec une date qui a l'air valide comme le 29/02/2015

    c'est une fonction MySQL/MariaDB, mais on peut espérer qu'un truc comme Oracle ait une fonction équivalente non ?

    Envoyé depuis mon Archlinux

  • # Re: Fonction qui vérifie la date ou retourne NULL ou DEFAULT s

    Posté par  . Évalué à 2. Dernière modification le 07 juillet 2016 à 18:19.

    Car j'ai un problème avec SQL qui me sort l'erreur suivante: ORA-01848: day of year must be between 1 and 365 (366 for leap year)

    Peut-on voir le code en question ou l'endroit qui génère l'erreure ?

    DECODE(DATASTREAM.P1EFTJ,0,0,to_number(to_char(user::jdatetimeToCalendar(DATASTREAM.P1EFTJ),'YYYYMMDD')))

    Je te suggère d'utiliser les conversions standards, i.e. CAST AS, ça te fera déjà un oracle-isme de moins… Btw, je reste dubitatif quant à la pertinence de faire une conversion to_char -> to number. Ne serait-il pas mieux d'utiliser TRUNC(date) voir, mieux, EXTRACT qui est standardisé SQL ?

    Ce que je souhaiterai c'est dire à cette fonction que lorsque le jour n'est pas compris entre 1 et 366

    Utilise CASE WHEN cond THEN … [WHEN cond2 THEN …] END à la place de ton DECODE, cf.
    http://docs.oracle.com/cd/B19306_01/server.102/b14200/expressions004.htm .

    PS: J'essayerais d'éviter un maximum les oracle-ismes. Là pluspart du temps il existe un fonction SQL équivalente: genre NVL -> COALESCE, TRUNC -> EXTRACT, CAST, etc. La doc de postgresql est très pratique pour cela :p

    • [^] # Re: Fonction qui vérifie la date ou retourne NULL ou DEFAULT s

      Posté par  . Évalué à 2. Dernière modification le 08 juillet 2016 à 05:16.

      J'ai vu que tu as posté la même question sur un autre forum (developpez.com) et que, ensuite, tu y as écris avoir trouvé une solution. Pourrait-on (au moins sur ce site…) connaître cette solution ?

      Je dis ça histoire d'apprendre moi aussi quelque chose car lire la doc d'oracle/pg, ça je savais déja faire… Pour preuve: je n'ai rien vu d'étrange dans ton utilisation de decode (mis à part le fait que tu ne sais pas faire un test ">366 ou <1"). Quel est ce paramètre en plus dont tu fais mention ?

      Deuxièmement, ta fameuse "user::jdatetimeToCalendar" ne devrait pas te rendre une date (ou null) directement ? Je veux dire, faire une validation de date avec des expression conditionnelles en SQL c'est un peu WTF, non ? Je vais peut-être t'apprende un truc, mais il parraitrait que certaines années il n'y a que 365 jours, c'est dingue non ?

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.