Parameter Kueri Tanggal Coldfusion MYSQL tidak memberikan hasil

Saya baru saja menemukan apa yang menurut saya pasti merupakan bug coldfusion.

Saya punya pertanyaan:

<cfquery name="qryTest" datasource="#This.ds#">
SELECT *
FROM MyLovelyTable 
WHERE 1=1 
AND phoneNumber = <cfqueryparam cfsqltype="cf_sql_bigint" value="#variables.phoneNumber#"> 
AND callTime between <cfqueryparam cfsqltype="cf_sql_date" value="#variables.startDate#"> AND <cfqueryparam cfsqltype="cf_sql_date" value="#variables.endDate#"> 
ORDER BY phoneID
</cfquery>

Masalahnya adalah jika saya melewati variabel tanggal kedua tidak ada yang dikembalikan. Jika saya menyalin awalan kueri SQL dan parameter keluar dan menanyakan database secara langsung, hasilnya dikembalikan. Hanya saja ketika melewati CF tidak berfungsi. Jika saya menghapus parameter tanggal kedua, itu berfungsi dengan baik. Dan jika saya mengubah parameter tanggal kedua menjadi string, itu akan berfungsi.

Saya sudah mencoba menukar nilai parameter kedua ke now() yang juga tidak berhasil.

Sejauh yang saya tahu masalahnya adalah parameter tanggal kedua adalah tipe tanggal.

Apakah saya melakukan kesalahan yang jelas-jelas tidak saya sadari?

Variabel startDate dan endDate adalah objek coldfusion dateTime. CallTime adalah kolom dateTime di MariaDB.


person Rumpleteaser    schedule 03.02.2014    source sumber
comment
Seperti disebutkan di bawah, cf_sql_datetime bukan tipe yang valid. Jenis tanggal/waktu yang valid adalah: cf_sql_date (hanya tanggal) dan cf_sql_timestamp (tanggal dan waktu). Namun, ekspresi yang benar bergantung pada nilai yang Anda bandingkan. Apakah nilai callTime hanya berisi tanggal atau berisi tanggal dan waktu? Jika hanya berisi tanggal, maka beralih ke cf_sql_date akan berhasil. Jika tidak, Anda memerlukan ekspresi yang berbeda.   -  person Leigh    schedule 03.02.2014
comment
@Leigh menggunakan cf_sql_timestamp tidak ada bedanya. menggunakan cf_sql_date tidak ada bedanya. Seperti yang disebutkan dalam pertanyaan saya, ekspresi SQL baik-baik saja, ini berfungsi ketika saya mentransfernya ke database dengan parameter kueri yang ditampilkan di objek kueri. Objek tanggal juga menyertakan elemen waktu.   -  person Rumpleteaser    schedule 04.02.2014
comment
@ Laura - Anda hanya memberi kami sebagian dari gambarannya. Kita perlu melihat a) nilai sebenarnya dari variabel: #startDate# dan #endDate# b) contoh nilai callTime dan c) hasil yang baik saat Anda mentransfernya ke database   -  person Leigh    schedule 04.02.2014
comment
Selain itu, berdasarkan nama kolom kita semua berasumsi bahwa tipe data callTime adalah datetime. Apakah itu benar?   -  person Leigh    schedule 04.02.2014
comment
@Leigh Ya callTime adalah kolom dateTime. A) diberi makan objek datetime coldfusion. B)contoh nilai callTime dari database: '01-02-2014 10:27:48' c) tidak mengerti maksud Anda di sini. Anda familiar dengan respons kueri di CF? Anda dapat menyalin sql yang dihasilkan dan mengganti parameter dengan parameter yang disediakan. Saya sudah melakukan itu. Hasil kueri tidak relevan. Masalahnya bukan pada pernyataan di antara, atau tanggal sebenarnya yang saya lewati. itu sesuatu yang funky dengan cfqueryparam   -  person Rumpleteaser    schedule 04.02.2014
comment
Ide di balik a,b and c adalah untuk menyediakan sscce yang dapat kami jalankan secara mandiri, dan mereproduksi masalah Anda. Ada beberapa kemungkinan alasan untuk hasil yang Anda peroleh dari cfquery, tetapi karena kami bahkan tidak mengetahui nilai parameter Anda... kami hanya dapat menebak apa alasannya. Masuk akal?   -  person Leigh    schedule 04.02.2014
comment
Masalahnya bukan pada pernyataan di antara, atau tanggal sebenarnya yang saya lewati. itu sesuatu yang funky dengan cfqueryparam Mungkin. Namun sampai Anda benar-benar mengetahui penyebab/solusi sebenarnya, jangan mengesampingkan apa pun. FWIW, kueri Anda saat ini tampaknya berfungsi dengan baik dengan driver mySQL bawaan. Tapi sekali lagi, tanpa kasus repro yang sebenarnya, saya hanya menebak-nebak nilai sebenarnya ... SQLFiddle * Kasus Uji   -  person Leigh    schedule 04.02.2014


Jawaban (1)


Coba gunakan cfsqltype="cf_sql_date" sebagai gantinya, karena "cf_sql_datetime" bukan pilihan yang valid. Lihat dokumen bantuan untuk cfqueryparam.

person Carl Von Stetten    schedule 03.02.2014
comment
cf_sql_datetime tidak didokumentasikan tetapi dapat berfungsi - mungkin tergantung pada driver JDBC spesifik yang digunakan atau semacamnya. - person Peter Boughton; 03.02.2014
comment
@PeterBoughton - Jika berhasil, mungkin itu kebetulan. Untuk mendapatkan fungsionalitas tanggal yang tepat, Anda perlu menggunakan tipe yang benar: cf_sql_timestamp. ACF hanya mengabaikan tipe yang tidak valid seperti cf_sql_datetime dan menggunakan cf_sql_char sebagai gantinya, yang mungkin akan meneruskan string daripada objek tanggal. - person Leigh; 03.02.2014
comment
Saya ingat secara khusus perlu menggunakan datetime alih-alih timestamp - mungkin karena tanggal/zona waktu bermasalah dan membiarkannya lewat sebagai string (yang kemudian dikonversi oleh DB sendiri) menghindari pemrosesan yang salah. - person Peter Boughton; 03.02.2014
comment
Ya, CF hampir pasti meneruskan nilai sebagai string dan membiarkan db melakukan konversi implisit. Saya kira Anda bisa menggunakan cf_sql_foo dan itu akan berhasil juga ;-) - person Leigh; 03.02.2014
comment
(Dan untuk memperjelas, saya tidak menyarankan OP tidak perlu menggunakan date atau timestamp sebagai gantinya, hanya saja ada kemungkinan alasan mengapa datetime dapat digunakan.) - person Peter Boughton; 03.02.2014
comment
Nah, melakukan itu pasti akan gagal karena keberadaan foo dalam kode saya akan secara otomatis memunculkan pengecualian DullExampleVariableName. :P - person Peter Boughton; 03.02.2014
comment
Ha ha. Oke, bagaimana dengan cf_sql_charcoalDateThymeInfusedBriquette? Atau dikenal sebagai cf_sql_char yang lebih biasa ;-) - person Leigh; 03.02.2014
comment
@cfvonner cf_sql_datetime tentu saja berfungsi secara umum untuk tanggal. Bidang tersebut bukan bidang stempel waktu karena itu saya menggunakan tanggal. Saya telah memperbarui sintaksis dalam pertanyaan dan menguji saran Anda. Tapi itu tidak mengubah apa pun. Satu-satunya hal yang membantu adalah meneruskan nilai kedua sebagai string dalam format yang tepat :S - person Rumpleteaser; 04.02.2014
comment
@LauraHansen - Tidak, ini tidak ada hubungannya dengan tanggal. Tipe cfsql didasarkan pada jdbc java.sql .Jenis dan tidak ada jenis seperti cf_sql_datetime. Tipe jdbc untuk melewatkan tanggal dan waktu adalah CATATAN WAKTU. Ketika CF melihat cf_sql_datetime, ia tidak tahu apa artinya, dan alih-alih membuat kesalahan, ia hanya mengganti cf_sql_char saja. - person Leigh; 04.02.2014
comment
(lanjutan) Jadi saat Anda menggunakannya, kemungkinan besar Anda melewati string. Meskipun database Anda mungkin dapat secara implisit mengonversi string tersebut ke tipe yang tepat, ... itu tidak berarti cf_sql_datetime sebenarnya adalah tipe cfsql yang valid. Oleh karena itu - apa tipe data sebenarnya dari kolom Anda: date, datetime, ...? - person Leigh; 04.02.2014