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

Oracle SQL:Udtræk af ugen i året fra dato giver tilfældige resultater

[TL;DR] Brug blot:TO_CHAR( tbl.col, 'IW' )

Du har flere problemer:

  1. Du kalder TO_DATE( string, format_model ) med en DATE (ikke en VARCHAR2 ), hvilket får Oracle til at foretage en implicit konvertering af DATE til en VARCHAR2 ved hjælp af NLS_DATE_FORMAT sessionsparameter som formatmodellen, bare så du kan konvertere den tilbage til en DATE . Så du gør effektivt:

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

    Gør ikke dette , brug bare:

    TO_CHAR( tbl.col, 'IW' )
    

    Hvis du gør det, er følgende spørgsmål irrelevante.

  2. Som RealCheeseLord påpeger, er positionen af ​​år og dag i din formatmodel omvendt; og
  3. Du bruger YYYY for årsmodellen, så alle årene vil være i det 1. århundrede e.Kr.

    Eksempel :

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

    Output :

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

    Hvis du ikke vil rette den implicitte strengkonvertering, vil du sandsynligvis enten have:

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

    eller (afhængigt af om du vil have år 99 til at være 1999 eller 2099):

    TO_CHAR(TO_DATE(tbl.col,'DD-MON-RR'),'IW') AS week
    
  4. Du bruger MM formatmodel for MON formaterede data - dette er ikke nødvendigvis et problem som MM matcher også MON og MONTH men du skal nok bruge den rigtige model.



  1. Er der et præstationshit ved hjælp af decimaldatatyper (MySQL / Postgres)

  2. Sådan INNER du JOIN 3 borde ved hjælp af CodeIgniter

  3. Oracle, Connect By rownum

  4. Falsk automatisk stigningsstigning på en tabel i MySQL ved hjælp af trigger