sql >> Base de Datos >  >> RDS >> Oracle

Oracle SQL:extraer la semana del año a partir de la fecha da resultados aleatorios

[TL;RD] Simplemente use:TO_CHAR( tbl.col, 'IW' )

Tiene varios problemas:

  1. Estás llamando a TO_DATE( string, format_model ) con una DATE (no un VARCHAR2 ) que hace que Oracle realice una conversión implícita de DATE a un VARCHAR2 usando el NLS_DATE_FORMAT parámetro de sesión como modelo de formato solo para que pueda volver a convertirlo en DATE . Entonces, efectivamente estás haciendo:

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

    No hagas esto , solo usa:

    TO_CHAR( tbl.col, 'IW' )
    

    Si lo hace, los siguientes problemas son irrelevantes.

  2. Como señala RealCheeseLord, la posición del año y el día en su modelo de formato está invertida; y
  3. Estás usando YYYY para el modelo de formato de año, por lo que todos los años estarán en el siglo I d.C.

    Ejemplo :

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

    Salida :

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

    Si no va a corregir la conversión de cadena implícita, probablemente desee:

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

    o (dependiendo de si quieres que el año 99 sea 1999 o 2099):

    TO_CHAR(TO_DATE(tbl.col,'DD-MON-RR'),'IW') AS week
    
  4. Estás usando el MM modelo de formato para MON datos formateados:esto no es necesariamente un problema ya que MM también coincide con MON y MONTH pero probablemente deberías usar el modelo correcto.