SQL Server GROUP BY datetime ละเว้นชั่วโมงนาทีและเลือกด้วยวันที่และค่าผลรวม


86

ฉันมีตารางที่มีสองช่อง - datetimeและint. ฉันต้องการทำกลุ่มในวันที่datetimeเดียวโดยไม่สนใจชั่วโมงและนาที SELECTงบควรจะกลับวันที่แมผลรวมของ int ของวันเดียวได้


1
การยอมรับคำตอบอย่างใดอย่างหนึ่งจะเป็นการดี ( เฉพาะผู้ถามเท่านั้นที่ทำได้ )
Used_By_Al แล้ว

คำตอบ:


138
SELECT CAST(Datetimefield AS DATE) as DateField, SUM(intfield) as SumField
FROM MyTable
GROUP BY CAST(Datetimefield AS DATE)

11
สิ่งนี้จะใช้ได้เฉพาะใน SQL Server 2008+ เท่านั้น (เมื่อมีการแนะนำประเภทข้อมูลวันที่) หากคุณอยู่ในปี 2005 หรือก่อนหน้าการเปลี่ยนแคสต์เพื่อแปลง (แปลง (int, Datetimefield) วันที่และเวลา) ควรใช้งานได้
Derek Kromm

ฉันได้รับข้อผิดพลาดแจ้งว่า 'Type Date ไม่ใช่ประเภทระบบที่กำหนดไว้'
Steven

5
@ สตีเวน - จากนั้นดูความคิดเห็นของ Derek ด้วยเหตุนี้จึงควรรวมVERSIONของคุณไว้ในคำถาม
JNK

@Derek นี้ดูเหมือนจะไม่ทำงาน select convert(convert(int, getdate()), datetime)ล้มเหลวด้วยไวยากรณ์ผิดพลาดที่ไม่ถูกต้อง
rabudde

1
ขออภัยแปลง (วันที่เวลา, แปลง (int, getdate ()))
Derek Kromm

24

เนื่องจากเขาไม่ได้ระบุเวอร์ชันของเซิร์ฟเวอร์ SQL ที่เขาใช้ (ไม่มีdateประเภทนี้ในปี 2548) จึงสามารถใช้ได้

SELECT CONVERT(VARCHAR(10),date_column,112),SUM(num_col) AS summed
FROM table_name
GROUP BY CONVERT(VARCHAR(10),date_column,112)

ในเวอร์ชันเก่าเช่นการแปลง varchar 2000/2005 สำหรับความต้องการนี้จะช้ากว่าการใช้DATEADD(dd, DATEDIFF(dd, 0, date_field),0)
Used_By_Al แล้ว

7

ฉันมาค้นคว้าเกี่ยวกับตัวเลือกที่ฉันจะต้องทำอย่างไรก็ตามฉันเชื่อว่าวิธีที่ฉันใช้นั้นง่ายที่สุด:

SELECT COUNT(*), 
       DATEADD(dd, DATEDIFF(dd, 0, date_field),0) as dtgroup 
FROM TABLE 
GROUP BY DATEADD(dd, DATEDIFF(dd, 0, date_field),0) 
ORDER BY dtgroup ASC;

1
สิ่งนี้จะทำงานใน SQL Server เวอร์ชันใดก็ได้และเร็วกว่าการใช้การแปลง varchar
Used_By_ แล้ว

คุณช่วยชี้แจงได้ไหมว่า "dd" คืออะไร ฉันไม่เข้าใจว่าคุณควรจะใส่อะไรลงไป
BelovedFool

"dd" คือส่วนของวันที่ที่เทียบเท่ากับวัน คุณยังสามารถใช้ "day", "d" หรือ "dd"
Jefferson Silva

3

- ฉันชอบสิ่งนี้เป็นประเภทข้อมูลและรูปแบบยังคงสอดคล้องกับประเภทข้อมูลวันเวลา

;with cte as(
    select 
        cast(utcdate as date) UtcDay, DATEPART(hour, utcdate) UtcHour, count(*) as Counts
    from dbo.mytable cd 
    where utcdate between '2014-01-14' and '2014-01-15'
    group by
        cast(utcdate as date), DATEPART(hour, utcdate)
)
select dateadd(hour, utchour, cast(utcday as datetime)) as UTCDateHour, Counts
from cte

2

โดยส่วนตัวแล้วฉันชอบฟังก์ชันรูปแบบช่วยให้คุณเปลี่ยนส่วนวันที่ได้อย่างง่ายดาย

     declare @format varchar(100) = 'yyyy/MM/dd'
     select 
        format(the_date,@format), 
        sum(myfield) 
     from mytable 
     group by format(the_date,@format) 
     order by format(the_date,@format) desc;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.