sql >> Databáze >  >> RDS >> Oracle

Oracle SQL:Extrahování týdne v roce od data dává náhodné výsledky

[TL;DR] Stačí použít:TO_CHAR( tbl.col, 'IW' )

Máte několik problémů:

  1. Voláte TO_DATE( string, format_model ) s DATE (nikoli VARCHAR2 ), což způsobí, že Oracle provede implicitní konverzi DATE na VARCHAR2 pomocí NLS_DATE_FORMAT parametr session jako model formátu, abyste jej mohli převést zpět na DATE . Takže efektivně děláte:

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

    Nedělejte to , stačí použít:

    TO_CHAR( tbl.col, 'IW' )
    

    Pokud to uděláte, pak jsou následující problémy irelevantní.

  2. Jak upozorňuje RealCheeseLord, pozice roku a dne ve vašem modelu formátu je obrácená; a
  3. Používáte YYYY pro model formátu roku, takže všechny roky budou v 1. století našeho letopočtu.

    Příklad :

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

    Výstup :

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

    Pokud se nechystáte opravit implicitní převod řetězce, pravděpodobně budete chtít buď:

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

    nebo (v závislosti na tom, zda chcete, aby rok 99 byl 1999 nebo 2099):

    TO_CHAR(TO_DATE(tbl.col,'DD-MON-RR'),'IW') AS week
    
  4. Používáte MM formátový model pro MON formátovaná data – to nemusí být nutně problém, protože MM odpovídá také MON a MONTH ale pravděpodobně byste měli použít správný model.



  1. SET IDENTITY_INSERT postgresql

  2. Jak předat proměnné do MYSQL pomocí Pythonu

  3. Vytvořte propojený server mezi dvěma kontejnery Docker se systémem SQL Server (příklad T-SQL)

  4. Data PHP mySql do souboru JSON