- SQL
- PL/SQL
- PL/SQL Avanzato
- DBA
- Forms
- Tips and Tricks
 
 
 

 
 
> Area Tips & Tricks  
 

Validazione DATE

di Giulia Basiricò

Fonte: http://www.geocities.com/oracletricks/plsql/isdate.txt

Volete sapere se un determinato valore rappresenta un formato di data valido? Allora questa funzione fa per voi!


 

CREATE OR REPLACE FUNCTION isdate (p_data IN VARCHAR2) RETURN DATE IS
/***************************************************************************/

/* La funzione inizia con l'esecuzione della to_date del parametro passato in input.                   */

/* Restituisce la data nel caso in cui la conversione ha esito positivo.                                            */

/* Se dovesse causare errore invece, Oracle solleva un'eccezione che verrà                               */

/* gestita nell'EXCEPTION ... da qui in poi un continuo propagarsi di eccezioni                             */

/* fino a quando non si arriva all'ultimo when others then nel quale la funzione                           */

/* restituisce NULL.                                                                                                                                     */

/***************************************************************************/

BEGIN

      RETURN TO_DATE (p_data, 'yyyy/mm/dd' );
EXCEPTION
      WHEN OTHERS THEN
              BEGIN
                    RETURN TO_DATE (p_data, 'yyyy-mm-dd');
              EXCEPTION
                    WHEN OTHERS THEN
                            BEGIN
                                  RETURN TO_DATE (p_data, 'yyyy dd MON');
                            EXCEPTION
                                   WHEN OTHERS THEN
                                           BEGIN
                                                 RETURN TO_DATE (p_data, 'yy-mm-dd');
                                           EXCEPTION
                                                  WHEN OTHERS THEN
                                                          BEGIN
                                                                RETURN TO_DATE (p_data, 'yy/mm/dd');
                                                          EXCEPTION
                                                                WHEN OTHERS THEN
                                                                        BEGIN
                                                                              RETURN TO_DATE (p_data, 'yy-mm-dd');
                                                                        EXCEPTION
                                                                              WHEN OTHERS THEN
                                                                                      BEGIN
                                                                                            RETURN TO_DATE (2439856 + p_data, 'j');
                                                                                      EXCEPTION
                                                                                            WHEN OTHERS THEN
                                                                                                   RETURN TO_DATE (NULL);
                                                                                      END;
                                                                        END;
                                                         END;
                                      END;
                        END;
            END;
END;


Qui di seguito un po' di prove per "dimostrare" il funzionamento!

(La funzione può essere implementata gestendo anche conversioni di date in altri fmt.
Qui è stato usato il fmt. "anno mese giorno").

SQL> SELECT ISDATE('20040119') RISULTATO FROM DUAL
2 /

RISULTATO
--------------
19-GEN-04

SQL> SELECT ISDATE('2004/01/19') RISULTATO FROM DUAL
2 /

RISULTATO
--------------
19-GEN-04


SQL> SELECT ISDATE('2004-01-19') RISULTATO FROM DUAL
2 /

RISULTATO
--------------
19-GEN-04


SQL> SELECT ISDATE('GIULIA ') RISULTATO FROM DUAL
2 /

RISULTATO
--------------


SQL> SELECT ISDATE('2004/13/01') RISULTATO FROM DUAL
2 /

RISULTATO
--------------




   - Notate che negli ultimi due casi la funzione ritorna null perchè il parametro passato
non rappresenta una data in fmt valido!