Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Oracle SQL:wyodrębnianie tygodnia roku od daty daje losowe wyniki

[TL;DR] Wystarczy użyć:TO_CHAR( tbl.col, 'IW' )

Masz wiele problemów:

  1. Dzwonisz TO_DATE( string, format_model ) z DATE (nie VARCHAR2 ), co powoduje, że Oracle dokonuje niejawnej konwersji DATE do VARCHAR2 za pomocą NLS_DATE_FORMAT parametr sesji jako model formatu, dzięki czemu można go przekonwertować z powrotem na DATE . Tak więc skutecznie robisz:

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

    Nie rób tego , wystarczy użyć:

    TO_CHAR( tbl.col, 'IW' )
    

    Jeśli to zrobisz, następujące kwestie są nieistotne.

  2. Jak wskazuje RealCheeseLord, pozycja roku i dnia w modelu formatu jest odwrócona; i
  3. Używasz YYYY dla modelu rocznego, więc wszystkie lata będą przypadać na I wiek naszej ery.

    Przykład :

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

    Wyjście :

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

    Jeśli nie zamierzasz naprawiać niejawnej konwersji ciągów, prawdopodobnie chciałbyś:

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

    lub (w zależności od tego, czy chcesz, aby rok 99 to 1999 czy 2099):

    TO_CHAR(TO_DATE(tbl.col,'DD-MON-RR'),'IW') AS week
    
  4. Używasz MM model formatu dla MON sformatowane dane – niekoniecznie jest to problem, ponieważ MM pasuje również do MON i MONTH ale prawdopodobnie powinieneś użyć właściwego modelu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zresetuj pozycję kursora po aktualizacji zestawu wyników

  2. Wykonywanie wielu poleceń pod inną nazwą użytkownika w pliku w powłoce BASH

  3. Jak uruchomić funkcje dbms_crypto w Oracle jako zwykły użytkownik?

  4. Pełna hierarchia Oracle SQL z dowolnym węzłem jako danymi wejściowymi

  5. Pobieranie wartości z tabeli Oracle DB do pola listy w c# /wpf