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

Menemukan tanggal di antara dua tanggal (Praktik terbaik)

Anda meminta praktik terbaik. Saya pikir berikut ini adalah praktik terbaik:

"Date" >= DATE '2014-04-11' AND "Date" < DATE '2014-04-12' + 1

Pertama, perhatikan penggunaan DATE kata kunci. Pertanyaan Anda adalah tentang tanggal namun Anda menggunakan format tanggal yang tidak didukung langsung oleh Oracle. Untungnya, Oracle mendukung standar ANSI DATE kata kunci dengan format standar ISO.

Kedua, saya menambahkan +1 sehingga Anda dapat melihat akhir periode waktu, yang mungkin ingin Anda lihat dalam kode. Seharusnya tidak memengaruhi kinerja karena + 1 berada pada konstanta.

Ketiga, konstanta tanggal memiliki komponen waktu. Ketika tidak ada yang ditentukan, itu adalah tengah malam pada tanggal tersebut. Jadi, ekspresinya:

"Date" BETWEEN '2014-04-11' AND '2014-04-12'

Benar-benar:

"Date" >= TIMESTAMP '2014-04-11 00:00:00' AND "Date" <= TIMESTAMP '2014-04-12 00:00:00'

Artinya, tepat satu kali dari tanggal kemudian disertakan, saat pertama di tengah malam. Ini biasanya bukan yang Anda inginkan. Oracle memperburuk masalah ini dengan dua cara:

  1. date tipe data mencakup komponen waktu.
  2. Cara default untuk menampilkan date nilai tidak memiliki komponen waktu.

Jadi, agar lebih aman, gunakan aturan berikut:

  • Jangan gunakan between berkencan.
  • Gunakan >= untuk kencan pertama.
  • Pengguna < untuk yang kedua.

Aaron Bertrand memiliki blog tepat pada topik ini. Meskipun secara khusus tentang SQL Server, banyak ide berlaku untuk Oracle -- terutama karena date tipe data di Oracle termasuk waktu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Gabungkan node XMLType dalam kueri Oracle

  2. Bagaimana cara menghitung ukuran tabel di Oracle

  3. Arahkan ADO.Net DataSet ke database yang berbeda saat runtime?

  4. ORA-00947 :Nilai Tidak Cukup

  5. Sisipan Rekursif menggunakan klausa connect by