วันที่และเวลาเท่ากับหรือมากกว่าวันนี้ใน MySQL


175

วิธีที่ดีที่สุดในการทำดังต่อไปนี้คือ:

SELECT * FROM users WHERE created >= today;

หมายเหตุ: created เป็นฟิลด์ datetime

คำตอบ:


329
SELECT * FROM users WHERE created >= CURDATE();

แต่ฉันคิดว่าคุณหมายถึง created < today


11
CURDATE()กลับวันที่เท่านั้นไม่ใช่เวลา
Shakti Singh

20
@ n00b คุณมีผู้ใช้ที่ถูกสร้างขึ้นในอนาคตอย่างไร? สนใจ =) ฉันใช้สิ่งนี้เพื่อดูว่าโพสต์หมดอายุหรือยัง
Garet Claborn

75
SELECT * FROM myTable WHERE  DATE(myDate) = DATE(NOW())

อ่านเพิ่มเติม: http://www.tomjepson.co.uk/tutorials/36/mysql-select-where-date-today.html


6
บางทีฉันอาจขาดอะไรบางอย่าง แต่ด้วยประเภท DATETIME โซลูชัน CURDATE () ไม่ทำงาน สิ่งนี้ทำ
Jahmic

นอกจากนี้ยังใช้เวลานานเนื่องจากมีค่าใช้จ่ายในการแปลง DATETIME เป็นวันที่ผ่านฟังก์ชั่น DATE () แล้วเปรียบเทียบกับสถานที่
roopunk

อย่าใช้ฟังก์ชั่นในคอลัมน์มันทำให้แบบสอบถามไม่สนใจดัชนีทำให้เกิดการสืบค้นที่ช้า ตรวจสอบคำตอบของฉันสำหรับวิธีการแบบอื่นstackoverflow.com/a/42365426/4311336
Bsienn

33
SELECT * FROM users WHERE created >= NOW();

ถ้าคอลัมน์เป็นประเภทวันที่และเวลา


1
ฉันหมายถึงวันนี้ไม่ใช่ตอนนี้: D ฉันต้องการวันนี้เช่น 2011-03-03 ไม่ใช่ 2011-03-03 14:02:02
n00b

@ n00b: มันจะส่งคืนแถวมากกว่าวันนี้ไม่ต้องกังวลถ้ารวมเวลาไว้ด้วย
Shakti Singh

3
สมมติว่าเป็น 2011-02-02 14:02:02 - ผู้ใช้ที่สร้างเมื่อ 10:02:02 จะไม่ถูกส่งคืนในเวอร์ชันของคุณแม้ว่าพวกเขาจะถูกสร้างขึ้น "วันนี้" :)
n00b

@ n00b: ฮ่า ๆ ๆ ๆ ไม่มีผู้ใช้ใด ๆ จะถูกส่งกลับถ้าเพียงเราสามารถหยุดเวลา
Mike Purcell

15

หาก 'สร้าง' เป็นประเภทวันที่และเวลา

SELECT * FROM users WHERE created < DATE_ADD(CURDATE(), INTERVAL 1 DAY);

CURDATE () หมายถึง '2013-05-09 00:00:00'


ขอบคุณสำหรับสิ่งนี้. ฉันต้องการ DATE_SUB จริง ๆ (ใช้วิธีเดียวกัน) แต่นี่ทำให้ฉันอยู่บนเส้นทางที่ถูกต้อง
Daniel Price

สิ่งนี้จะไม่ส่งคืนข้อมูลที่วันที่มีเวลา 0s เช่น '2013-05-09 00:00:00' จะพลาด
Bsienn

8

คำตอบที่ทำเครื่องหมายไว้นั้นทำให้เข้าใจผิด คำถามที่ระบุไว้มีแต่ระบุสิ่งที่ถูกต้องเป็นเพียงแค่DateTimeCURDATE()

คำตอบที่สั้นที่สุดและถูกต้องนี้คือ:

SELECT * FROM users WHERE created >= CURRENT_TIMESTAMP;

5

หากคอลัมน์มีดัชนีและมีการใช้ฟังก์ชันในคอลัมน์ดัชนีจะไม่ทำงานและการสแกนตารางแบบเต็มเกิดขึ้นทำให้เกิดการสืบค้นที่ช้ามาก

การใช้ดัชนีและเปรียบเทียบวันที่และเวลาที่มีวันนี้วันที่ / ปัจจุบันต่อไปนี้สามารถนำมาใช้

โซลูชันสำหรับ OP:

select * from users
where created > CONCAT(CURDATE(), ' 23:59:59')

ตัวอย่างเพื่อรับข้อมูลสำหรับวันนี้:

select * from users
where 
    created >= CONCAT(CURDATE(), ' 00:00:00') AND
    created <= CONCAT(CURDATE(), ' 23:59:59')

หรือใช้ระหว่างระยะสั้น

select * from users 
where created BETWEEN 
      CONCAT(CURDATE(), ' 00:00:00') AND CONCAT(CURDATE(), ' 23:59:59')

2
SELECT * FROM users WHERE created >= now()

นี่จะไม่ส่งคืนระเบียนก่อนหน้าช่วงเวลาตั้งแต่วันนี้
gsziszi

0

รหัสด้านล่างใช้งานได้สำหรับฉัน

declare @Today date

Set @Today=getdate() --date will equal today    

Select *

FROM table_name
WHERE created <= @Today

-1
SELECT * FROM table_name WHERE CONCAT( SUBSTRING(json_date, 11, 4 ) ,  '-', SUBSTRING( json_date, 7, 2 ) ,  '-', SUBSTRING(json_date, 3, 2 ) ) >= NOW();

json_date ["05/11/2011"]


นี่เป็นวิธีการแก้ปัญหาที่ดิบมาก
IgniteCoders

-5

คุณสามารถส่งคืนแถวทั้งหมดและแทนที่จะใช้ฟังก์ชัน php dateiff ภายในคำสั่ง if แม้ว่าจะเพิ่มภาระพิเศษบนเซิร์ฟเวอร์

if(dateDiff(date("Y/m/d"), $row['date']) <=0 ){    
}else{    
echo " info here";    
}

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