MySQL / SQL: จัดกลุ่มตามวันที่ในคอลัมน์วันที่เท่านั้น


182

มีตารางที่มีคอลัมน์ดังนี้: mydate DATETIME...

ฉันมีคำถามเช่น:

SELECT SUM(foo), mydate FROM a_table GROUP BY a_table.mydate;

จะจัดกลุ่มตามแบบเต็มdatetimeรวมถึงชั่วโมงและนาที ฉันต้องการที่จะทำให้กลุ่มโดยเฉพาะตามวันที่ไม่ได้โดยYYYY/MM/DDYYYY/MM/DD/HH/mm

ใครรู้วิธีการทำเช่นนี้? ฉันยังคงสามารถทำได้ (อย่างที่ฉันเป็น atm) ในรหัสของฉันแบบไดนามิก แต่ฉันกำลังทำความสะอาดถังขยะและสิ่งนี้สามารถทำได้ผ่าน SQL ฉันไม่สามารถหาวิธี :(


1
คำอธิบายที่ดีกว่าในคำตอบนี้ !
webcoder

คำตอบ:


287

ส่งวันที่และเวลาไปที่วันที่แล้วตามกลุ่มโดยใช้ไวยากรณ์นี้:

SELECT SUM(foo), DATE(mydate) FROM a_table GROUP BY DATE(a_table.mydate);

หรือคุณสามารถจัดกลุ่มตามชื่อแทนตามที่แนะนำ @ orlandu63:

SELECT SUM(foo), DATE(mydate) DateOnly FROM a_table GROUP BY DateOnly;

แม้ว่าฉันจะไม่คิดว่ามันจะสร้างความแตกต่างให้กับการแสดง แต่ก็ชัดเจนขึ้นเล็กน้อย


1
คุณแน่ใจหรือไม่ว่าอันที่สองใช้งานได้? บน SQL Server สิ่งนี้ล้มเหลวและล้มเหลวด้วยเหตุผลที่ดี ฉันคาดหวังว่ามันจะล้มเหลวที่อื่นเช่นกัน คุณสามารถยืนยันได้ว่า MySQL จัดการแบบสอบถามนี้จริงหรือ
Tomalak

1
ฉันแค่ลองมันแล้วก็ใช้งานได้ดี MySQL อนุญาตให้ใช้งาน GROUP BY ได้มากขึ้นและเชื่อใจให้คุณเขียนแบบสอบถามที่ไม่ชัดเจน
Bill Karwin

ขอบคุณสำหรับข้อมูล. ฉันไม่สามารถตัดสินใจได้ว่านี่เป็นสิ่งที่ดีหรือไม่ แต่มันก็เหมาะสมกับความคิดเห็นของฉันเกี่ยวกับ MySQL จากมุมมองเทคนิค - สิ่งนี้ควรทำงานอย่างไร ฉันสามารถจินตนาการได้ว่าตัวแยกวิเคราะห์แบบสอบถามใช้แทนนามแฝงในกลุ่มตามข้อด้วยการแสดงออกจริง
Tomalak

17
มันเป็นกับดักประสิทธิภาพ! โปรดทราบว่าการใช้ฟังก์ชันเช่นนี้ - DATE () ไม่อนุญาตให้คุณใช้ประโยชน์จากดัชนีในคอลัมน์นี้
Kamil Bednarz

ฉันใช้อันแรกและมันก็ใช้งานได้อย่างมีเสน่ห์ ขอบคุณสำหรับเคล็ดลับนี้
เฮเลนนีลี

20

ฉันพบว่าฉันต้องการจัดกลุ่มตามเดือนและปีดังนั้นสิ่งเหล่านี้จึงไม่ได้ผลสำหรับฉัน ฉันใช้ date_format แทน

SELECT date
FROM blog 
GROUP BY DATE_FORMAT(date, "%m-%y")
ORDER BY YEAR(date) DESC, MONTH(date) DESC 

2
ข้อความค้นหาไม่เป็นระเบียบ
ZJS

19

หรือ:

SELECT SUM(foo), DATE(mydate) mydate FROM a_table GROUP BY mydate;

มีประสิทธิภาพมากขึ้น (ฉันคิดว่า) เพราะคุณไม่ต้องส่ง mydate สองครั้งต่อแถว


7
ฉันจะแปลกใจมากถ้า MySQL ใช้การแปลงสองครั้ง เฉพาะฟังก์ชั่นรวมและการแสดงออกในกลุ่มโดยรายการได้รับอนุญาตในกลุ่มโดยงบเลือก เครื่องยนต์รู้อยู่แล้วว่าทั้งสองนิพจน์เหมือนกัน
Tmdean

1
@Tmdean, 'อนุญาตให้ฟังก์ชั่นรวมและการแสดงออกในกลุ่มตามรายการได้รับอนุญาตในกลุ่มโดยเลือกคำสั่ง' - คุณสามารถอธิบายมันด้วยคำง่าย ๆ ได้ไหม?
Istiaque Ahmed

9
SELECT SUM(No), HOUR(dateofissue) 
FROM tablename 
WHERE dateofissue>='2011-07-30' 
GROUP BY HOUR(dateofissue)

มันจะให้ชั่วโมงโดยรวมจากวันใดวันหนึ่ง!

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