sql >> Databasteknik >  >> RDS >> Oracle

Oracle SQL:Att extrahera veckan på året från datum ger slumpmässiga resultat

[TL;DR] Använd bara:TO_CHAR( tbl.col, 'IW' )

Du har flera problem:

  1. Du anropar TO_DATE( string, format_model ) med en DATE (inte en VARCHAR2 ) vilket får Oracle att göra en implicit konvertering av DATE till en VARCHAR2 med NLS_DATE_FORMAT sessionsparameter som formatmodellen bara så att du kan konvertera den tillbaka till en DATE . Så du gör faktiskt:

    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 inte detta , använd bara:

    TO_CHAR( tbl.col, 'IW' )
    

    Om du gör det är följande frågor irrelevanta.

  2. Som RealCheeseLord påpekar är positionen för år och dag i din formatmodell omvänd; och
  3. Du använder YYYY för årsmodellen så att alla år kommer att vara i det 1:a århundradet e.Kr.

    Exempel :

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

    Utdata :

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

    Om du inte ska fixa den implicita strängkonverteringen så vill du förmodligen antingen:

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

    eller (beroende på om du vill att år 99 ska vara 1999 eller 2099):

    TO_CHAR(TO_DATE(tbl.col,'DD-MON-RR'),'IW') AS week
    
  4. Du använder MM formatmodell för MON formaterad data – detta är inte nödvändigtvis ett problem eftersom MM matchar även MON och MONTH men du bör förmodligen använda rätt modell.



  1. Hur man gör SQL Server CE-tabelluppdatering från en annan tabell

  2. Accenttecken i mySQL-tabellen

  3. Optimera frågor baserade på klustrade och icke-klustrade index i SQL?

  4. kontrollera om det är en nummerfunktion i Oracle