ฉันจะค้นหาระหว่างสองวันโดยใช้ MySQL ได้อย่างไร


225

แบบสอบถามต่อไปนี้:

SELECT * FROM `objects` 
WHERE (date_field BETWEEN '2010-09-29 10:15:55' AND '2010-01-30 14:15:55')

ไม่มีอะไรคืน

ฉันควรมีข้อมูลมากเกินพอที่จะให้แบบสอบถามทำงานได้ ผมทำอะไรผิดหรือเปล่า?


32
ใช้ความระมัดระวังระหว่าง BETWEEN เนื่องจากทั้งสองอย่าง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
ขั้นต่ำ

ใช่สิ่งที่เขาพูดถึง ^^
Albert Rannetsperger

คำตอบ:


472

วันที่ที่สองของคุณอยู่ก่อนวันที่แรกของคุณ (เช่นคุณกำลังสอบถามระหว่าง 29 กันยายน 2010 ถึง 30 มกราคม 2010) ลองย้อนลำดับของวันที่:

SELECT *
FROM `objects`
WHERE (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')

ฉันรู้สิ่งนี้ แต่ตอนนี้มีปัญหากับ UPDATE ฉันกำลังพยายามใช้ BETWEEN เพื่ออัปเดตมันควรจะทำงานในลักษณะเดียวกันหรือไม่
Ingus

3
@IngusGraholskis: whereประโยคควรทำงานเหมือนกันบนselectหรือupdateข้อความ
T30

โดยส่วนตัวแล้วฉันพบคำว่า 'จาก' และ 'เป็น' วิธีที่ไม่ลับเพื่อจำลำดับที่ควรจะเขียนแบบสอบถาม
KeaganFouche

จะส่งคืนข้อมูลทั้งหมดอย่างไรถ้าวันที่ทั้งสองเป็นโมฆะหรือว่างเปล่า?
เข้ารหัสโลก

23

ข้อความค้นหาของคุณควรมีวันที่ดังนี้

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

20

เป็นdate_fieldประเภทdatetimeหรือไม่ นอกจากนี้คุณต้องใส่วันที่ของ eariler ก่อน

มันควรจะเป็น:

SELECT * FROM `objects` 
WHERE  (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')

17

DATE () เป็นฟังก์ชั่น MySQL ที่แยกเฉพาะส่วนวันที่ของการแสดงออกของวันที่หรือวันที่ / เวลา

SELECT * FROM table_name WHERE DATE(date_field) BETWEEN '2016-12-01' AND '2016-12-10';

คุณสามารถเพิ่มคำอธิบายเพื่อให้ผู้คนเข้าใจว่าคุณกำลังทำอะไรอยู่
Franz Gleichmann

7

เป็นส่วนขยายของคำตอบจาก @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')

4

คุณสามารถทำได้ด้วยตนเองโดยเปรียบเทียบกับมากกว่าหรือเท่ากับและน้อยกว่าหรือเท่ากับ

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

1

อาจมีปัญหากับการกำหนดค่าวันที่บนฝั่งเซิร์ฟเวอร์หรือฝั่งไคลเอ็นต์ ฉันพบว่านี่เป็นปัญหาที่พบบ่อยในหลายฐานข้อมูลเมื่อโฮสต์ถูกกำหนดค่าในสเปน, ฝรั่งเศสหรืออะไรก็ตาม ... ที่อาจส่งผลต่อรูปแบบ dd / mm / yyyy หรือ mm / dd / yyyy


3
ปัญหาคือวันที่เก่ากว่าถูกแสดงรายการก่อนวันที่ใหม่กว่า
theninjagreg

1

เพียง Cast date_field เป็นวันที่

SELECT * FROM `objects` 
WHERE (cast(date_field as date) BETWEEN '2010-09-29' AND 
'2010-01-30' )

1

เมื่อใช้วันและค่าเวลาที่คุณต้องโยนฟิลด์เป็นและไม่ได้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))

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.