Oracle
 sql >> Base de données >  >> RDS >> Oracle

Oracle SQL :l'extraction de la semaine de l'année à partir de la date donne des résultats aléatoires

[TL;DR] Utilisez simplement :TO_CHAR( tbl.col, 'IW' )

Vous avez plusieurs problèmes :

  1. Vous appelez TO_DATE( string, format_model ) avec une DATE (pas un VARCHAR2 ) qui oblige Oracle à effectuer une conversion implicite de la DATE à un VARCHAR2 en utilisant le NLS_DATE_FORMAT paramètre de session comme modèle de format juste pour que vous puissiez le reconvertir en DATE . Ainsi, vous faites effectivement :

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

    Ne faites pas cela , utilisez simplement :

    TO_CHAR( tbl.col, 'IW' )
    

    Si vous faites cela, les problèmes suivants ne sont pas pertinents.

  2. Comme le souligne RealCheeseLord, la position de l'année et du jour dans votre modèle de format est inversée ; et
  3. Vous utilisez YYYY pour le modèle de format d'année, toutes les années seront donc au 1er siècle après JC.

    Exemple :

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

    Sortie :

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

    Si vous n'allez pas corriger la conversion de chaîne implicite, vous voudrez probablement :

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

    ou (selon que vous voulez que l'année 99 soit 1999 ou 2099) :

    TO_CHAR(TO_DATE(tbl.col,'DD-MON-RR'),'IW') AS week
    
  4. Vous utilisez le MM modèle de format pour MON données formatées - ce n'est pas nécessairement un problème car MM correspond également à MON et MONTH mais vous devriez probablement utiliser le bon modèle.