Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle SQL:Das Extrahieren der Woche des Jahres aus dem Datum ergibt zufällige Ergebnisse

[TL;DR] Verwenden Sie einfach:TO_CHAR( tbl.col, 'IW' )

Sie haben mehrere Probleme:

  1. Sie rufen TO_DATE( string, format_model ) auf mit einem DATE (kein VARCHAR2 ), wodurch Oracle eine implizite Konvertierung des DATE durchführt zu einem VARCHAR2 mit dem NLS_DATE_FORMAT session-Parameter als Formatmodell, damit Sie es wieder in ein DATE umwandeln können . Sie tun also effektiv:

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

    Tun Sie dies nicht , verwenden Sie einfach:

    TO_CHAR( tbl.col, 'IW' )
    

    Wenn Sie das tun, sind die folgenden Punkte irrelevant.

  2. Wie RealCheeseLord betont, ist die Position von Jahr und Tag in Ihrem Formatmodell umgekehrt; und
  3. Sie verwenden YYYY für das Jahresformatmodell werden also alle Jahre im 1. Jahrhundert n. Chr. liegen.

    Beispiel :

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

    Ausgabe :

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

    Wenn Sie die implizite Zeichenfolgenkonvertierung nicht beheben möchten, möchten Sie wahrscheinlich eines von beiden:

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

    oder (je nachdem, ob das Jahr 99 1999 oder 2099 sein soll):

    TO_CHAR(TO_DATE(tbl.col,'DD-MON-RR'),'IW') AS week
    
  4. Sie verwenden das MM Formatmodell für MON formatierte Daten - dies ist nicht unbedingt ein Problem, da MM passt auch zu MON und MONTH aber Sie sollten wahrscheinlich das richtige Modell verwenden.