แบบสอบถามต่อไปนี้:
SELECT * FROM `objects`
WHERE (date_field BETWEEN '2010-09-29 10:15:55' AND '2010-01-30 14:15:55')
ไม่มีอะไรคืน
ฉันควรมีข้อมูลมากเกินพอที่จะให้แบบสอบถามทำงานได้ ผมทำอะไรผิดหรือเปล่า?
แบบสอบถามต่อไปนี้:
SELECT * FROM `objects`
WHERE (date_field BETWEEN '2010-09-29 10:15:55' AND '2010-01-30 14:15:55')
ไม่มีอะไรคืน
ฉันควรมีข้อมูลมากเกินพอที่จะให้แบบสอบถามทำงานได้ ผมทำอะไรผิดหรือเปล่า?
คำตอบ:
วันที่ที่สองของคุณอยู่ก่อนวันที่แรกของคุณ (เช่นคุณกำลังสอบถามระหว่าง 29 กันยายน 2010 ถึง 30 มกราคม 2010) ลองย้อนลำดับของวันที่:
SELECT *
FROM `objects`
WHERE (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')
where
ประโยคควรทำงานเหมือนกันบนselect
หรือupdate
ข้อความ
ข้อความค้นหาของคุณควรมีวันที่ดังนี้
select * from table between `lowerdate` and `upperdate`
ลอง
SELECT * FROM `objects`
WHERE (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')
เป็นdate_field
ประเภทdatetime
หรือไม่ นอกจากนี้คุณต้องใส่วันที่ของ eariler ก่อน
มันควรจะเป็น:
SELECT * FROM `objects`
WHERE (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')
DATE () เป็นฟังก์ชั่น MySQL ที่แยกเฉพาะส่วนวันที่ของการแสดงออกของวันที่หรือวันที่ / เวลา
SELECT * FROM table_name WHERE DATE(date_field) BETWEEN '2016-12-01' AND '2016-12-10';
เป็นส่วนขยายของคำตอบจาก @sabin และให้คำแนะนำหากต้องการเปรียบเทียบส่วนวันที่เท่านั้น (ไม่มีเวลา):
ถ้าเขตข้อมูลเพื่อเปรียบเทียบจากประเภทdatetimeและมีเพียงวันที่ที่ระบุไว้ในการเปรียบเทียบแล้วเหล่านี้วันที่จะถูกแปลงภายในเพื่อdatetimeค่า ซึ่งหมายความว่าแบบสอบถามต่อไปนี้
SELECT * FROM `objects` WHERE (date_time_field BETWEEN '2010-01-30' AND '2010-09-29')
จะถูกแปลงเป็น
SELECT * FROM `objects` WHERE (date_time_field BETWEEN '2010-01-30 00:00:00' AND '2010-09-29 00:00:00')
ภายใน
สิ่งนี้จะนำไปสู่ผลลัพธ์ที่ไม่รวมวัตถุตั้งแต่ 2010-09-29 ที่มีค่าเวลามากกว่า 00:00:00!
ดังนั้นหากวัตถุทั้งหมดที่มีวันที่ 2010-09-29 ควรถูกรวมด้วยเช่นกันฟิลด์ที่จะเปรียบเทียบจะต้องถูกแปลงเป็นวันที่:
SELECT * FROM `objects` WHERE (DATE(date_time_field) BETWEEN '2010-01-30' AND '2010-09-29')
คุณสามารถทำได้ด้วยตนเองโดยเปรียบเทียบกับมากกว่าหรือเท่ากับและน้อยกว่าหรือเท่ากับ
select * from table_name where created_at_column >= lower_date and created_at_column <= upper_date;
ในตัวอย่างของเราเราจำเป็นต้องดึงข้อมูลจากวันใดวันหนึ่ง เราจะเปรียบเทียบจากจุดเริ่มต้นของวันกับวินาทีล่าสุดในอีกวัน
select * from table_name where created_at_column >= '2018-09-01 00:00:00' and created_at_column <= '2018-09-05 23:59:59';
อาจมีปัญหากับการกำหนดค่าวันที่บนฝั่งเซิร์ฟเวอร์หรือฝั่งไคลเอ็นต์ ฉันพบว่านี่เป็นปัญหาที่พบบ่อยในหลายฐานข้อมูลเมื่อโฮสต์ถูกกำหนดค่าในสเปน, ฝรั่งเศสหรืออะไรก็ตาม ... ที่อาจส่งผลต่อรูปแบบ dd / mm / yyyy หรือ mm / dd / yyyy
เพียง Cast date_field เป็นวันที่
SELECT * FROM `objects`
WHERE (cast(date_field as date) BETWEEN '2010-09-29' AND
'2010-01-30' )
เมื่อใช้วันและค่าเวลาที่คุณต้องโยนฟิลด์เป็นและไม่ได้DateTime
Date
ลอง :
SELECT * FROM `objects`
WHERE (CAST(date_field AS DATETIME)
BETWEEN CAST('2010-09-29 10:15:55' AS DATETIME) AND CAST('2010-01-30 14:15:55' AS DATETIME))
ลองเปลี่ยนวันที่รอบ ๆ :
2010-09-29 > 2010-01-30?
min
และmax
ค่าจะถูกพิจารณาว่าอยู่ในช่วงที่จะไม่ประมวลผลวันที่สองครั้งที่เป็นทั้งค่าmin
และmax
ค่า (ตัวพิมพ์ขอบ) ตัวอย่างเช่นวันที่2010-09-29 00:00:00
จะอยู่ระหว่าง2010-09-28 00:00:00
และ2010-09-29 00:00:00
, และยัง ระหว่าง2010-09-29 00:00:00
และ2010-09-30 00:00:00