MySQL เลือกวันที่ของเมื่อวาน


104

ฉันจะแสดงและนับค่าของเมื่อวานนี้ได้อย่างไร? ฉันใช้time()เพื่อแทรกวันที่ในฐานข้อมูล ตัวอย่าง:

URL: google.com youtube.com google.com youtube.com test.com youtube.com
DateVisited: 1313668492 1313668540 1313668571 13154314

ฉันต้องการแสดงจำนวน URL ที่มีหลายรายการในตารางและจำนวน URL ที่เข้าชมเมื่อวานนี้ ตัวอย่างผลลัพธ์:

LINK       | timesExisted | timesVisitedYesterday
Google.com |       2      | 2
youtube.com|       3      | 3

ฉันมีความคิดที่จะหาวันที่ของเมื่อวานนี้แล้ว แต่ฉันไม่มีความคิดที่จะนับจำนวนครั้งที่มี URL ในเมื่อวานนี้และนับจำนวนครั้งที่มี URL อยู่ในตาราง

คำตอบ:


169

วิธีที่ง่ายที่สุดและดีที่สุดในการหาวันที่เมื่อวานคือ:

subdate(current_date, 1)

คำถามของคุณจะเป็น:

SELECT 
    url as LINK,
    count(*) as timesExisted,
    sum(DateVisited between UNIX_TIMESTAMP(subdate(current_date, 1)) and
        UNIX_TIMESTAMP(current_date)) as timesVisitedYesterday
FROM mytable
GROUP BY 1

สำหรับคนที่อยากรู้อยากเห็นเหตุผลที่sum(condition)ทำให้คุณมีจำนวนแถวที่ตรงตามเงื่อนไขซึ่งอาจต้องใช้คำcaseสั่งที่ยุ่งยากและซับซ้อนนั่นก็คือในค่าบูลีน mysql นั้นเป็น1จริงและ0เท็จดังนั้นการสรุปเงื่อนไขอย่างมีประสิทธิภาพจะนับกี่ครั้ง มันเป็นความจริง. การใช้รูปแบบนี้สามารถทำให้โค้ด SQL ของคุณเรียบร้อย


92
SELECT SUBDATE(NOW(),1);

โดยที่ now () ฟังก์ชันจะเรียกคืนวันที่และเวลาปัจจุบันของระบบใน Timestamp ...

คุณสามารถใช้ได้:

SELECT SUBDATE(CURDATE(),1)

3
ทำงานให้ฉัน ขอบคุณมาก
mable george

21

คุณสามารถใช้ได้:

SELECT SUBDATE(NOW(), 1);

หรือ

SELECT SUBDATE(NOW(), INTERVAL 1 DAY);

หรือ

SELECT NOW() - INTERVAL 1 DAY;

หรือ

SELECT DATE_SUB(NOW(), INTERVAL 1 DAY);

12

CAST(NOW() - INTERVAL 1 DAY AS DATE)คุณจะได้รับวันที่เมื่อวานนี้โดยใช้การแสดงออก ดังนั้นสิ่งนี้อาจใช้ได้:

SELECT * FROM your_table

WHERE DateVisited >= UNIX_TIMESTAMP(CAST(NOW() - INTERVAL 1 DAY AS DATE))
  AND DateVisited <= UNIX_TIMESTAMP(CAST(NOW() AS DATE));

9

คำค้นหาสำหรับสัปดาห์ที่แล้ว:

SELECT *
FROM dual
WHERE search_date BETWEEN SUBDATE(CURDATE(), 7) AND CURDATE()

9

การคำนวณวันที่สัปดาห์เดือนและปีล่าสุดหรือถัดไป อาจเป็นประโยชน์สำหรับทุกคน

วันที่ปัจจุบัน:

select curdate();

เมื่อวาน:

select subdate(curdate(), 1)

พรุ่งนี้:

select adddate(curdate(), 1)

1 สัปดาห์ล่าสุด:

select between subdate(curdate(), 7) and subdate(curdate(), 1)

1 สัปดาห์ถัดไป:

between adddate(curdate(), 7) and adddate(curdate(), 1)

1 เดือนล่าสุด:

between subdate(curdate(), 30) and subdate(curdate(), 1)

1 เดือนถัดไป:

between adddate(curdate(), 30) and adddate(curdate(), 1)

เดือนนี้:

subdate(curdate(),day(curdate())-1) and last_day(curdate());

1 ปีล่าสุด:

between subdate(curdate(), 365) and subdate(curdate(), 1)

1 ปีถัดไป:

between adddate(curdate(), 365) and adddate(curdate(), 1)

7

ในขณะที่คำตอบที่เลือกนั้นถูกต้องและรัดกุมกว่า แต่ฉันจะโต้แย้งโครงสร้างที่ระบุไว้ในคำตอบอื่น ๆ :

SELECT * FROM your_table
WHERE UNIX_TIMESTAMP(DateVisited) >= UNIX_TIMESTAMP(CAST(NOW() - INTERVAL 1 DAY AS DATE))
  AND UNIX_TIMESTAMP(DateVisited) <= UNIX_TIMESTAMP(CAST(NOW() AS DATE));

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

SELECT * FROM your_table
WHERE DateVisited >= CAST(NOW() - INTERVAL 1 DAY AS DATE)
  AND DateVisited <= CAST(NOW() AS DATE);

เหตุผลสำหรับการใช้CASTกับSUBDATEมีCASTไวยากรณ์ ANSI SQL SUBDATEเป็นการใช้งานเฉพาะ MySQL ขององค์ประกอบเลขคณิตวันที่ของCAST. การทำความคุ้นเคยกับการใช้ไวยากรณ์ ANSI สามารถลดอาการปวดหัวได้หากคุณต้องย้ายไปยังฐานข้อมูลอื่น นอกจากนี้ยังเป็นการดีที่จะปฏิบัติตนให้เป็นนิสัยเนื่องจากคุณจะทำงานร่วมกับ DBMS อื่น ๆ ในอนาคตได้อย่างแน่นอน

ไม่มีระบบ DBMS หลักใดที่เป็นไปตามมาตรฐาน ANSI อย่างสมบูรณ์ แต่ส่วนใหญ่ใช้ไวยากรณ์ ANSI แบบกว้าง ๆ ในขณะที่แทบไม่มีระบบใดที่อยู่นอก MySQL และลูกหลาน (MariaDB, Percona ฯลฯ ) จะใช้ไวยากรณ์เฉพาะ MySQL


คำอธิบายที่ดีว่าเหตุใดจึงควรเลือกอย่างใดอย่างหนึ่ง
Sablefoste

4

ฉันปรับคำตอบข้างต้นจาก cdhowie เนื่องจากไม่สามารถใช้งานได้ ดูเหมือนว่าจะได้ผลสำหรับฉัน ฉันสงสัยว่าเป็นไปได้ที่จะทำเช่นนี้โดยใช้ฟังก์ชัน UNIX_TIMESTAMP

SELECT * FROM your_table

WHERE UNIX_TIMESTAMP(DateVisited) >= UNIX_TIMESTAMP(CAST(NOW() - INTERVAL 1 DAY AS DATE))
  AND UNIX_TIMESTAMP(DateVisited) <= UNIX_TIMESTAMP(CAST(NOW() AS DATE));
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.