พารามิเตอร์การค้นหาวันที่ Coldfusion MYSQL ไม่ส่งคืนผลลัพธ์

ฉันเพิ่งเจอสิ่งที่ฉันคิดว่าน่าจะเป็นแมลง Coldfusion

ฉันมีคำถาม:

<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>

ปัญหาคือว่าหากฉันผ่านตัวแปรวันที่ที่สองจะไม่มีการส่งคืนสิ่งใดเลย ถ้าฉันคัดลอกคำนำหน้าแบบสอบถาม SQL และพารามิเตอร์ออกและสอบถามฐานข้อมูลโดยตรงผลลัพธ์จะถูกส่งกลับ พอผ่าน CF แล้วมันใช้งานไม่ได้ ถ้าฉันลบพารามิเตอร์วันที่ที่สองออก มันก็จะทำงานได้ดี และถ้าฉันแปลงพารามิเตอร์วันที่ที่สองเป็นสตริง มันก็จะทำงานได้

ฉันได้ลองสลับค่าของพารามิเตอร์ตัวที่สองเป็น now() ซึ่งไม่ได้ผลเช่นกัน

เท่าที่ฉันสามารถบอกได้ปัญหาก็คือพารามิเตอร์วันที่ที่สองเป็นประเภทวันที่

ฉันกำลังทำอะไรผิดอย่างชัดเจนโดยที่ฉันไม่รู้หรือเปล่า?

ตัวแปร startDate และ endDate คือออบเจ็กต์ Coldfusion dateTime CallTime เป็นคอลัมน์ dateTime ใน MariaDB


person Rumpleteaser    schedule 03.02.2014    source แหล่งที่มา
comment
ตามที่กล่าวไว้ด้านล่าง cf_sql_datetime ไม่ใช่ประเภทที่ถูกต้อง ประเภทวันที่/เวลาที่ถูกต้องคือ: cf_sql_date (วันที่เท่านั้น) และ cf_sql_timestamp (วันที่และเวลา) อย่างไรก็ตาม นิพจน์ที่ถูกต้องจะขึ้นอยู่กับค่าที่คุณกำลังเปรียบเทียบ ค่า callTime เป็นเพียงวันที่หรือมีวันที่และเวลาหรือไม่ หากมีเพียงวันที่ การสลับไปที่ cf_sql_date จะช่วยได้ มิฉะนั้นคุณจะต้องใช้สำนวนอื่น   -  person Leigh    schedule 03.02.2014
comment
@Leigh การใช้ cf_sql_timestamp ไม่ได้สร้างความแตกต่าง การใช้ cf_sql_date ไม่ได้สร้างความแตกต่าง ตามที่กล่าวไว้ในคำถามของฉัน นิพจน์ SQL นั้นใช้ได้ มันใช้งานได้เมื่อฉันถ่ายโอนไปยังฐานข้อมูลด้วยพารามิเตอร์แบบสอบถามที่แสดงในวัตถุแบบสอบถาม วัตถุวันที่จะมีองค์ประกอบเวลาด้วย   -  person Rumpleteaser    schedule 04.02.2014
comment
@ ลอร่า - คุณให้รูปภาพแก่เราเพียงบางส่วนเท่านั้น เราจำเป็นต้องดู a) ค่าจริงของตัวแปร: #startDate# และ #endDate# b) ตัวอย่างของค่า callTime และ c) ผลลัพธ์ที่ดีเมื่อคุณ ถ่ายโอนไปยังฐานข้อมูล   -  person Leigh    schedule 04.02.2014
comment
นอกจากนี้ จากชื่อคอลัมน์ เราทุกคนต่างสันนิษฐานว่าประเภทข้อมูล callTime คือวันที่และเวลา ถูกต้องไหม?   -  person Leigh    schedule 04.02.2014
comment
@Leigh ใช่ callTime เป็นคอลัมน์ dateTime A) กำลังถูกป้อนวัตถุ datetime ของ Coldfusion B) ตัวอย่างค่า callTime จากฐานข้อมูล: '2014-02-01 10:27:48' c) ไม่เข้าใจสิ่งที่คุณหมายถึงที่นี่ คุณคุ้นเคยกับการตอบแบบสอบถามใน CF หรือไม่? คุณสามารถคัดลอก sql ที่สร้างขึ้นออกและแทนที่พารามิเตอร์ด้วยพารามิเตอร์ที่ให้มา ฉันทำอย่างนั้นแล้ว ผลลัพธ์ของแบบสอบถามไม่เกี่ยวข้อง ปัญหาไม่ได้อยู่ที่คำสั่งระหว่างหรือวันที่จริงที่ฉันส่งผ่าน มันเป็นอะไรที่ขี้ขลาดกับ cfqueryparam   -  person Rumpleteaser    schedule 04.02.2014
comment
แนวคิดเบื้องหลัง a,b and c คือการจัดหา sscce ซึ่งเราสามารถดำเนินการได้อย่างอิสระ และจำลองปัญหาของคุณ มีสาเหตุที่เป็นไปได้หลายประการสำหรับผลลัพธ์ที่คุณได้รับจาก cfquery แต่เนื่องจากเราไม่ทราบค่าของพารามิเตอร์ของคุณด้วยซ้ำ... เราจึงได้แต่เดาได้ว่าเหตุผลนั้นคืออะไร ทำให้รู้สึก?   -  person Leigh    schedule 04.02.2014
comment
ปัญหาไม่ได้อยู่ที่คำสั่งระหว่างหรือวันที่จริงที่ฉันส่งผ่าน มันมีอะไรแปลกๆ กับ cfqueryparam อาจจะเป็นไปได้ แต่จนกว่าคุณจะทราบสาเหตุ/วิธีแก้ไขที่แท้จริง อย่าตัดทอนสิ่งใดเลย FWIW ดูเหมือนว่าแบบสอบถามปัจจุบันของคุณจะทำงานได้ดีกับไดรเวอร์ mySQL ในตัว แต่อีกครั้ง หากไม่มีกรณีจำลองจริง ฉันแค่เดาเกี่ยวกับค่าจริง ... SQLFiddle * กรณีทดสอบ   -  person Leigh    schedule 04.02.2014


คำตอบ (1)


ลองใช้ cfsqltype="cf_sql_date" แทน เนื่องจาก "cf_sql_datetime" ไม่ใช่ตัวเลือกที่ถูกต้อง ดูเอกสารช่วยเหลือสำหรับ cfqueryparam

person Carl Von Stetten    schedule 03.02.2014
comment
cf_sql_datetime ไม่ได้รับการบันทึกไว้ แต่สามารถใช้งานได้ - อาจขึ้นอยู่กับไดรเวอร์ JDBC เฉพาะที่ใช้หรือบางอย่าง - person Peter Boughton; 03.02.2014
comment
@PeterBoughton - ถ้ามันได้ผลอาจเป็นเรื่องบังเอิญ เพื่อให้ได้ฟังก์ชันวันที่ที่เหมาะสม คุณต้องใช้ประเภทที่ถูกต้อง: cf_sql_timestamp ACF เพียงละเว้นประเภทที่ไม่ถูกต้อง เช่น cf_sql_datetime และใช้ cf_sql_char แทน ซึ่งอาจส่งผ่านสตริงแทนที่จะเป็นวัตถุวันที่ - person Leigh; 03.02.2014
comment
ฉันจำได้ว่าจำเป็นต้องใช้ datetime แทน timestamp โดยเฉพาะ - อาจเป็นเพราะวันที่/เขตเวลามีข้อผิดพลาดและปล่อยให้มันผ่านไปเป็นสตริง (ซึ่ง DB เองก็แปลงแล้ว) หลีกเลี่ยงการประมวลผลที่ไม่ถูกต้อง - person Peter Boughton; 03.02.2014
comment
ใช่แล้ว CF เกือบจะแน่นอนว่ากำลังส่งค่าเป็นสตริงและปล่อยให้ db ทำการแปลงโดยนัย ฉันสงสัยว่าคุณสามารถใช้ cf_sql_foo และมันก็ได้ผลเช่นกัน ;-) - person Leigh; 03.02.2014
comment
(และเพื่อชี้แจงให้กระจ่าง ฉันไม่ได้กำลังแนะนำว่า OP ไม่จำเป็นต้องใช้ date หรือ timestamp แทน เพียงแต่ว่ามีเหตุผลที่เป็นไปได้ว่าทำไมถึงใช้ datetime) - person Peter Boughton; 03.02.2014
comment
ไม่นะ การทำเช่นนั้นคงจะพังอย่างแน่นอนเนื่องจากการมีอยู่ของ foo ในโค้ดของฉันจะทำให้เกิดข้อยกเว้น DullExampleVariableName โดยอัตโนมัติ :ป - person Peter Boughton; 03.02.2014
comment
ฮ่าๆ โอเค แล้วcf_sql_charcoalDateThymeInfusedBriquetteล่ะ? หรือที่รู้จักกันทั่วไปว่า cf_sql_char ;-) - person Leigh; 03.02.2014
comment
@cfvonner cf_sql_datetime ใช้งานได้โดยทั่วไปสำหรับวันที่อย่างแน่นอน ฟิลด์นี้ไม่ใช่ฟิลด์การประทับเวลาดังนั้นฉันจึงใช้วันที่ ฉันได้อัปเดตไวยากรณ์ในคำถามและทดสอบข้อเสนอแนะของคุณแล้ว แต่มันไม่ได้เปลี่ยนแปลงอะไร สิ่งเดียวที่ช่วยได้คือส่งค่าที่สองผ่านเป็นสตริงในรูปแบบที่ถูกต้อง :S - person Rumpleteaser; 04.02.2014
comment
@LauraHansen - ไม่มันไม่เกี่ยวอะไรกับวันที่ cfsqltypes ขึ้นอยู่กับ jdbc java.sql .Types และ ไม่มีประเภทดังกล่าวเป็น cf_sql_datetime ประเภท jdbc สำหรับการส่งวันที่และเวลาคือ การประทับเวลา เมื่อ CF ดู cf_sql_datetime ก็ไม่รู้ว่ามันหมายถึงอะไร และแทนที่จะแสดงข้อผิดพลาด มันจะแทนที่ cf_sql_char แทน - person Leigh; 04.02.2014
comment
(ต่อ) ดังนั้น เมื่อคุณใช้มัน คุณน่าจะผ่าน string มากที่สุด แม้ว่าฐานข้อมูลของคุณอาจสามารถแปลงสตริงนั้นเป็นประเภทที่เหมาะสมโดยปริยายได้ แต่ ... ไม่ได้หมายความว่า cf_sql_datetime เป็น cfsqltype ที่ถูกต้องจริงๆ ที่กล่าวว่า - ประเภทข้อมูลที่แท้จริงของคอลัมน์ของคุณคืออะไร: date, datetime, ...? - person Leigh; 04.02.2014