Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Oracle SQL:Mengekstrak minggu dalam setahun dari tanggal memberikan hasil acak

[TL;DR] Cukup gunakan:TO_CHAR( tbl.col, 'IW' )

Anda memiliki banyak masalah:

  1. Anda memanggil TO_DATE( string, format_model ) dengan DATE (bukan VARCHAR2 ) yang menyebabkan Oracle melakukan konversi implisit dari DATE ke VARCHAR2 menggunakan NLS_DATE_FORMAT parameter sesi sebagai model format agar Anda dapat mengubahnya kembali menjadi DATE . Jadi, Anda secara efektif melakukan:

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

    Jangan lakukan ini , cukup gunakan:

    TO_CHAR( tbl.col, 'IW' )
    

    Jika Anda melakukannya, maka masalah berikut tidak relevan.

  2. Seperti yang ditunjukkan oleh RealCheeseLord, posisi tahun dan hari dalam model format Anda terbalik; dan
  3. Anda menggunakan YYYY untuk model format tahun sehingga semua tahun akan berada di abad ke-1 Masehi.

    Contoh :

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

    Keluaran :

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

    Jika Anda tidak akan memperbaiki konversi string implisit maka Anda mungkin ingin:

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

    atau (tergantung apakah Anda ingin tahun 99 menjadi 1999 atau 2099):

    TO_CHAR(TO_DATE(tbl.col,'DD-MON-RR'),'IW') AS week
    
  4. Anda menggunakan MM model format untuk MON data yang diformat - ini tidak selalu menjadi masalah karena MM juga cocok dengan MON dan MONTH tetapi Anda mungkin harus menggunakan model yang benar.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle (ORA-02270):tidak ada kunci unik atau kunci utama yang cocok untuk kesalahan daftar kolom ini

  2. Mengambil nilai dari 3 tabel

  3. ORA-01401:nilai yang dimasukkan terlalu besar untuk kolom CHAR

  4. Bagaimana cara melewatkan seluruh baris (dalam SQL, bukan PL/SQL) ke fungsi yang disimpan?

  5. Buat fungsi pl/sql &temukan tahun kabisat