Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Oracle SQL:Extrair a semana do ano da data dá resultados aleatórios


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

Você tem vários problemas:

  1. Você está chamando TO_DATE( string, format_model ) com um DATE (não um VARCHAR2 ) que faz com que o Oracle faça uma conversão implícita do DATE para um VARCHAR2 usando o NLS_DATE_FORMAT parâmetro de sessão como o modelo de formato apenas para que você possa convertê-lo de volta para um DATE . Então, você está efetivamente fazendo:
    TO_CHAR(
      TO_DATE(
        TO_CHAR(
          tbl.col,
          ( SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT' )
        ),
        'YYYY/MM/DD'
      ),
      'IW'
    )
    

    Não faça isso , Apenas use:
    TO_CHAR( tbl.col, 'IW' )
    

    Se você fizer isso, os seguintes problemas serão irrelevantes.
  2. Como RealCheeseLord aponta, a posição do ano e do dia em seu modelo de formato é invertida; e

  3. Você está usando YYYY para o modelo de formato de ano, então todos os anos serão no século I dC.

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

    Saída :
    DT
    ----------
    0019-06-17
    

    Se você não vai corrigir a conversão de string implícita, provavelmente vai querer:
    TO_CHAR(TO_DATE(tbl.col,'DD-MON-YY'),'IW') AS week
    

    ou (dependendo se você deseja que o ano 99 seja 1999 ou 2099):
    TO_CHAR(TO_DATE(tbl.col,'DD-MON-RR'),'IW') AS week
    

  4. Você está usando o MM modelo de formato para MON dados formatados - isso não é necessariamente um problema, pois MM também corresponde a MON e MONTH mas você provavelmente deve usar o modelo correto.