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) ataucf_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.