sql >> Database >  >> RDS >> Oracle

Oracle SQL:het extraheren van de week van het jaar uit de datum geeft willekeurige resultaten

[TL;DR] Gebruik gewoon:TO_CHAR( tbl.col, 'IW' )

Je hebt meerdere problemen:

  1. Je belt TO_DATE( string, format_model ) met een DATE (geen VARCHAR2 ) waardoor Oracle een impliciete conversie uitvoert van de DATE naar een VARCHAR2 met behulp van de NLS_DATE_FORMAT sessieparameter als het formaatmodel zodat u het terug kunt converteren naar een DATE . U doet dus effectief:

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

    Doe dit niet , gebruik gewoon:

    TO_CHAR( tbl.col, 'IW' )
    

    Als u dat doet, zijn de volgende problemen niet relevant.

  2. Zoals RealCheeseLord aangeeft, is de positie van jaar en dag in uw formaatmodel omgekeerd; en
  3. U gebruikt YYYY voor het jaarformaat, zodat alle jaren in de 1e eeuw na Christus zullen zijn.

    Voorbeeld :

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

    Uitvoer :

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

    Als je de impliciete tekenreeksconversie niet gaat repareren, dan zou je waarschijnlijk het volgende willen:

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

    of (afhankelijk van of je wilt dat het jaar 99 1999 of 2099 is):

    TO_CHAR(TO_DATE(tbl.col,'DD-MON-RR'),'IW') AS week
    
  4. Je gebruikt de MM formaatmodel voor MON geformatteerde gegevens - dit is niet noodzakelijk een probleem als MM komt ook overeen met MON en MONTH maar u moet waarschijnlijk het juiste model gebruiken.



  1. Microsoft Access Table Tips – Trucs &Richtlijnen Deel 5

  2. Verwijder volgnullen in decimale waarde met veranderende lengte

  3. mysql n:m relatie:Vind rijen met verschillende specifieke relaties

  4. psql.exe - wachtwoordverificatie mislukt in Windows