Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Format tanggal dan klarifikasi SQL Query

Itu banyak pertanyaan untuk satu utas .. tapi saya akan mencoba dan menjawab sebagian besar dari mereka. (Pertanyaan pertama bisa kamu jawab sendiri, hanya dengan mencobanya;-)

Sejauh kueri, bahkan jika itu berjalan tanpa kesalahan - itu dapat ditingkatkan. Saya tidak akan menulis ulang kueri untuk Anda, tetapi inilah masalah utamanya

  • Pertama, tidak pernah gunakan nilai klien mentah langsung di SQL. Selalu gunakan cfqueryparam untuk melindungi dari injeksi sql. Ini juga memiliki manfaat lain, tetapi itu sangat penting dalam aplikasi web.

  • Kedua, Anda memasukkan string tanggal . String tanggal bersifat ambigu dan dapat disalahartikan, bergantung pada format dan alat yang melakukan penguraian. Jauh lebih baik menggunakan tanggal objek alih-alih. Salah satu cara untuk melakukannya adalah dengan menggunakan cfqueryparam dan salah satu jenis tanggal:cf_sql_date (hanya tanggal) atau cf_sql_timestamp (tanggal dan waktu).

  • Ketiga, seperti yang saya sebutkan di utas Anda yang lain , Anda benar-benar perlu menyederhanakan kueri Anda! Banyaknya subkueri sudah sulit digunakan .. menambahkan filter tanggal ke setiap subkueri membuatnya benar-benar tidak dapat dikelola. Saya akan merekomendasikan mencari cara untuk menyederhanakannya. Saran Ed menawarkan satu kemungkinan, dengan menguranginya menjadi satu JOIN dan beberapa panggilan fungsi.

Sebenarnya begitulah cara IDE Anda ditampilkan itu kepada manusia. Itu tidak benar-benar disimpan seperti itu. Secara internal, tanggal disimpan sebagai angka besar. Namun, kueri Anda perlu memperhitungkan fakta bahwa kolom Anda menyimpan tanggal dan waktu.

Katakanlah Anda ingin mengambil semua catatan bertanggal di bulan Juni:

    form.startDate = "06/01/2013"
    form.endDate = "06/30/2013"

Secara konseptual, Anda memerlukan ekspresi sql seperti ini:

    WHERE column BETWEEN '06/01/2013 at midnight' AND '06/30/2013 11:59:59 PM' 

Namun, membangun nilai tanggal/waktu tersebut adalah IMO yang agak kikuk. Cara yang lebih sederhana untuk menanganinya adalah dengan menggunakan paradigma ini:

   WHERE column >= {startDateAtMidnight}        
   AND   column <  {dayAfterEndDateAtMidnight}

Filter kueri Anda yang sebenarnya akan terlihat seperti ini:

    WHERE column >= <cfqueryparam value="#form.startDate#" 
                                  cfsqltype="cf_sql_date">
    AND   column <  <cfqueryparam value="#dateAdd('d', 1, form.endDate)#" 
                                  cfsqltype="cf_sql_date">

Dengan menambahkan satu hari ke form.endDate , dan menggunakan < perbandingan, query yang dihasilkan adalah:

    WHERE column >= '2013-06-01 00:00:00'  
    AND   column < '2013-07-01 00:00:00'  

Ini akan menghasilkan hasil yang sama persis seperti ekspresi ANTARA sebelumnya.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana kita bisa membedakan LEFT OUTER JOIN vs Left Join

  2. Cara mengetahui ukuran Indeks di MySQL

  3. Pencarian MySQL Fulltext terhadap nilai kolom?

  4. Bagaimana saya bisa melakukan 'masukkan jika tidak ada' di MySQL?

  5. MySQL Query untuk menemukan teman dan jumlah teman bersama