เลือกบันทึกจาก NOW () -1 วัน


148

มีวิธีในคำสั่ง MySQL ในการสั่งซื้อบันทึก (ผ่านการประทับวันที่) โดย> = NOW () -1 ดังนั้นจึงเลือกบันทึกทั้งหมดตั้งแต่วันก่อนวันนี้ถึงอนาคต

คำตอบ:


289

เมื่อพิจารณาจากเอกสารสำหรับฟังก์ชั่นวันที่ / เวลาคุณควรจะทำสิ่งต่อไปนี้ได้

SELECT * FROM FOO
WHERE MY_DATE_FIELD >= NOW() - INTERVAL 1 DAY

วิธีการรับตอนนี้ .. หมายถึงวันที่ปัจจุบันของบันทึกทั้งหมดที่มีอยู่ในฐานข้อมูล เหรอ? นี่เป็นเพียงวันเดียว แต่ฉันต้องการบันทึกทั้งหมดตอนนี้เป็นคำพูด @ จอน
Muddasir อับบาส

พิจารณาเวลาท้องถิ่นของผู้ใช้เมื่อบันทึกอยู่ใน UTC หรือไม่
Adry

1
@Adry: ฉันสงสัย แต่คุณควรทดสอบอย่างรอบคอบ
Jon Skeet

66

โปรดทราบว่าผลลัพธ์อาจแตกต่างจากที่คุณคาดไว้เล็กน้อย

NOW()ส่งคืน a DATETIME.

และทำงานเป็นชื่อเช่นINTERVALINTERVAL 1 DAY = 24 hours

ดังนั้นหากสคริปต์ของคุณต้องการเรียกใช้ cron 03:00ก็จะพลาดไฟล์first three hours of records from the 'oldest' day.

CURDATE() - INTERVAL 1 DAYที่จะได้รับการใช้งานตลอดทั้งวัน สิ่งนี้จะย้อนกลับไปที่จุดเริ่มต้นของวันก่อนหน้าโดยไม่คำนึงว่าสคริปต์จะทำงานเมื่อใด



9

ไม่เห็นคำตอบที่ถูกต้องโดยใช้DATE_ADDหรือDATE_SUB:

ลบ 1 วันจาก NOW()

...WHERE DATE_FIELD >= DATE_SUB(NOW(), INTERVAL 1 DAY)

เพิ่ม 1 วันจาก NOW()

...WHERE DATE_FIELD >= DATE_ADD(NOW(), INTERVAL 1 DAY)

ดู "สะอาดกว่า" อย่างใด แต่ก็ "หนัก" เช่นกัน มีมูลค่าเพิ่มในการเรียกเมธอดอย่างชัดเจนแทนที่จะใช้การบวก / การลบแบบธรรมดาหรือไม่?
Balmipour


1

เมื่อช่องค้นหามีการประทับเวลาและคุณต้องการค้นหาบันทึกจาก 0 ชั่วโมงเมื่อวานนี้และ 0 ชั่วโมงในวันนี้ให้ใช้การก่อสร้าง

MY_DATE_TIME_FIELD between makedate(year(now()), date_format(now(),'%j')-1) and makedate(year(now()), date_format(now(),'%j'))  

แทน

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