Oracle
 sql >> Database >  >> RDS >> Oracle

Oracle SQL:l'estrazione della settimana dell'anno dalla data fornisce risultati casuali

[TL;DR] Basta usare:TO_CHAR( tbl.col, 'IW' )

Hai più problemi:

  1. Stai chiamando TO_DATE( string, format_model ) con un DATE (non un VARCHAR2 ) che fa sì che Oracle esegua una conversione implicita di DATE a un VARCHAR2 utilizzando il NLS_DATE_FORMAT parametro di sessione come modello di formato in modo da poterlo riconvertire in un DATE . Quindi, stai effettivamente facendo:

    TO_CHAR(
      TO_DATE(
        TO_CHAR(
          tbl.col,
          ( SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT' )
        ),
        'YYYY/MM/DD'
      ),
      'IW'
    )
    

    Non farlo , usa:

    TO_CHAR( tbl.col, 'IW' )
    

    Se lo fai, i seguenti problemi sono irrilevanti.

  2. Come sottolinea RealCheeseLord, la posizione dell'anno e del giorno nel modello di formato è invertita; e
  3. Stai utilizzando YYYY per il modello in formato anno, quindi tutti gli anni saranno nel I secolo d.C.

    Esempio :

    SELECT TO_CHAR( TO_DATE( '19-Jun-17', 'YYYY/MM/DD' ), 'YYYY-MM-DD' ) AS dt
    FROM   DUAL
    

    Risultato :

    DT
    ----------
    0019-06-17
    

    Se non hai intenzione di correggere la conversione implicita della stringa, probabilmente vorresti anche:

    TO_CHAR(TO_DATE(tbl.col,'DD-MON-YY'),'IW') AS week
    

    oppure (a seconda che tu voglia che l'anno 99 sia 1999 o 2099):

    TO_CHAR(TO_DATE(tbl.col,'DD-MON-RR'),'IW') AS week
    
  4. Stai usando il MM modello di formato per MON dati formattati - questo non è necessariamente un problema in quanto MM corrisponde anche a MON e MONTH ma probabilmente dovresti usare il modello corretto.