SQL Server GROUP BY datetime ignoriert Stunde Minute und eine Auswahl mit einem Datum und einem Summenwert

82

Ich habe eine Tabelle mit zwei Feldern - datetimeund int. Ich möchte eine Gruppe bis zum datetimeeinzigen Datum bilden, wobei Stunde und Minute ignoriert werden. Die SELECTAnweisung sollte ein Datum zurückgeben, das der Summe des int eines einzelnen Tages entspricht.

Steven
quelle
1
Eine der Antworten zu akzeptieren wäre nett ( das kann nur der Fragesteller )
Used_By_Already

Antworten:

132
SELECT CAST(Datetimefield AS DATE) as DateField, SUM(intfield) as SumField
FROM MyTable
GROUP BY CAST(Datetimefield AS DATE)
JNK
quelle
11
Dies funktioniert nur in SQL Server 2008+ (als der Datentyp Datum eingeführt wurde). Wenn Sie 2005 oder früher sind, sollte das Ändern der Umwandlung in "konvertieren" (konvertieren (int, Datetimefield), datetime) funktionieren.
Derek Kromm
Ich erhalte die Fehlermeldung "Typdatum ist kein definierter Systemtyp".
Steven
5
@Steven - dann siehe Dereks Kommentar. Aus diesem Grund ist es eine gute Idee, Ihre VERSION in die Frage aufzunehmen.
JNK
@Derek das scheint nicht zu funktionieren. A select convert(convert(int, getdate()), datetime)schlägt mit falschem Syntaxfehler fehl
Rabudde
1
Entschuldigung, konvertieren (datetime, konvertieren (int, getdate ()))
Derek Kromm
24

Da er nicht angegeben hat, welche Version von SQL Server er verwendet ( dateTyp ist 2005 nicht verfügbar), könnte man auch verwenden

SELECT CONVERT(VARCHAR(10),date_column,112),SUM(num_col) AS summed
FROM table_name
GROUP BY CONVERT(VARCHAR(10),date_column,112)
Rabudde
quelle
In älteren Versionen wie 2000/2005 ist die Varchar-Konvertierung für diesen Bedarf langsamer als die Verwendung vonDATEADD(dd, DATEDIFF(dd, 0, date_field),0)
Used_By_Already
6

Ich habe nach Möglichkeiten gesucht, dies zu tun. Ich glaube jedoch, dass die von mir verwendete Methode die einfachste ist:

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;
Jefferson Silva
quelle
1
Dies funktioniert in jeder Version von SQL Server und ist schneller als die Verwendung von varchar-Konvertierungen.
Used_By_Already
Könnten Sie klarstellen, was "dd" ist? Ich verstehe nicht, was du hineinstecken sollst.
BelovedFool
"dd" ist ein Datum, das dem Tag entspricht. Sie können auch "Tag", "d" oder "dd" verwenden
Jefferson Silva
3

- Ich mag dies, da der Datentyp und das Format mit einem Datums- / Uhrzeitdatentyp übereinstimmen

;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
SqlHog
quelle
2

Persönlich bevorzuge ich die Formatierungsfunktion, mit der Sie den Datumsteil ganz einfach ändern können.

     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;
Krik
quelle