Mengabaikan pendekatan yang benar
untuk sesaat, alasan yang terjadi adalah Anda menggunakan cfsqltype
yang salah untuk parameter. Jadi Anda sebenarnya mengirim nilai yang berbeda ke database (dan akibatnya melakukan perbandingan yang berbeda) dari yang Anda pikirkan. Akibatnya, kueri gagal menemukan rekaman yang cocok. Itulah sebabnya bagan Anda kosong.
Dengan menggunakan cf_sql_timestamp
anda mengubah "nilai" menjadi objek tanggal/waktu penuh. Namun, TAHUN() hanya mengembalikan nomor empat digit. Jadi Anda membandingkan apel dan jeruk. Secara konseptual, kueri Anda sebenarnya melakukan ini:
WHERE 2014 = {ts '2009-02-13 23:31:30'}
Alasan mengapa itu tidak menimbulkan kesalahan adalah bahwa nilai tanggal/waktu disimpan sebagai angka secara internal. Jadi Anda sebenarnya membandingkan angka kecil (yaitu tahun) dengan angka yang sangat besar (yaitu tanggal/waktu). Jelas nilai tanggal akan jauh lebih besar, sehingga hampir tidak akan pernah cocok dengan angka tahun. Sekali lagi, secara konseptual kueri Anda melakukan ini:
WHERE 2014 = 1234567890
Karena cfsqltype adalah opsional, banyak orang menganggapnya tidak terlalu penting - tetapi memang demikian.
-
Validasi: Selain manfaat lainnya, cfqueryparam memvalidasi "nilai" yang diberikan, berdasarkan
cfsqltype
(tanggal, tanggal dan waktu, nomor, dan sebagainya). Ini terjadi sebelum sql pernah dikirim ke database. Jadi jika inputnya tidak valid, Anda tidak menyia-nyiakan panggilan database. Jika Anda menghilangkan cfsqltype, atau hanya menggunakan string default, maka Anda kehilangan validasi ekstra itu. -
Akurasi Memilih cfsqltype yang tepat memastikan Anda mengirim nilai yang benar ke database. Seperti yang ditunjukkan di atas, menggunakan tipe yang salah dapat menyebabkan CF mengirim nilai yang salah ke database.
cfsqltype
juga memastikan nilai dikirimkan ke database dalam format yang tidak ambigu, database akan menafsirkan seperti yang Anda harapkan. Secara teknis Anda bisa mengirim semuanya ke database sebuah string. Namun, hal itu memaksa database untuk melakukan konversi implisit (biasanya tidak diinginkan).Dengan konversi implisit, interpretasi string diserahkan sepenuhnya ke database - dan mungkin tidak selalu muncul dengan jawaban yang Anda harapkan. Mengirimkan tanggal sebagai string, bukan objek tanggal, adalah contoh utama dari itu. Bagaimana database saat ini menafsirkan string tanggal seperti "05/04/2014"? Seperti 5 April atau 4 Mei? Tergantung. Ubah database atau pengaturan database dan hasilnya mungkin sama sekali berbeda.
Satu-satunya cara untuk memastikan hasil yang konsisten adalah dengan menentukan cfsqltype yang sesuai. Itu harus cocok dengan tipe data dari kolom/fungsi perbandingan, atau setidaknya tipe yang setara. Dalam kasus YEAR()
, ia mengembalikan angka empat digit. Jadi Anda harus menggunakan cf_sql_integer
, seperti Adrian menyebutkan komentarnya
. Hal yang sama berlaku untuk BULAN() perbandingan.
WHERE Year(ColumnName) = <cfqueryparam value="2014" cfsqltye="CF_SQL_INTEGER">
AND Month(ColumnName) = <cfqueryparam value="11" cfsqltye="CF_SQL_INTEGER">
Sekarang setelah mengatakan semua itu, Saran Dan
adalah cara yang lebih baik untuk melakukan perbandingan tanggal. Paradigma itu
lebih ramah indeks dan berfungsi terlepas dari apakah kolom target Anda berisi tanggal (hanya) atau tanggal dan waktu. Perhatikan penggunaan cf_sql_date
dalam teladannya.
cf_sql_timestamp
- mengirimkan tanggal dan waktucf_sql_date
- mengirim tanggal saja. nilai waktu terpotong