2017-11-25 2 views
1

Ich möchte Stundenbericht erstellen und diese Abfrage wird einwandfrei ausgeführt.Gruppieren nach Datum und Stunde: 00: 00 in SQL Server 2008

SELECT 
    FORMAT(PingLogDate,'yyyy-MM-dd-HH:00:00') AS CalculatedTime, 
    COUNT(PingLogID) AS PingCount 
FROM 
    tbl_PingLog 
GROUP BY 
    FORMAT(PingLogDate,'yyyy-MM-dd-HH:00:00') 
ORDER BY 
    FORMAT(PingLogDate,'yyyy-MM-dd-HH:00:00') 

Aber ich bin zur Unterstützung der SQL Server 2008 und Format ist neu in SQL Server 2012, so habe ich versucht, diesen Code

SELECT 
    CAST(PingLogDate AS date) AS CalculatedDate, 
    DATEPART(hour, PingLogDate) AS CalculatedTime, 
    COUNT(PingLogID) AS PingCount 
FROM 
    tbl_PingLog 
GROUP BY 
    CAST(PingLogDate AS date), DATEPART(hour, PingLogDate) 
ORDER BY 
    CAST(PingLogDate AS date), DATEPART(hour, PingLogDate) 

Das Problem ist nicht auf 2 Spalte für Datum und Stunde wollen, ist es zum Beispiel

Ergebnis der ersten Abfrage ist

CalculatedTime  | PingCount 
--------------------+----------- 
2017-11-07-12:00:00 | 359 
2017-11-07-13:00:00 | 359 
2017-11-07-14:00:00 | 350 

Zweite Ergebnis der Abfrage i s

CalculatedDate |CalculatedTime | PingCount 
---------------+---------------+---------- 
2017-11-07  |12    | 359 
2017-11-07  |13    | 359 
2017-11-07  |14    | 350 

Ich möchte nicht zweite. Ich will den ersten. Vorgehensweise bei SQL Server 2008-unterstützten Tools

Antwort

0

können Sie verwenden, um die CONVERTdatetime Spalte yyyy-mm-dd hh:mi:ss(24h) Format zu transformieren und dann mit - den Raum ersetzen.

Etwas wie folgt aus:

SELECT REPLACE(CONVERT(VARCHAR(32), PingLogDate, 120), ' ', '-') AS CalculatedTime, 
     COUNT(PingLogID) AS PingCount 
FROM tbl_PingLog 
GROUP BY REPLACE(CONVERT(VARCHAR(32), PingLogDate, 120), ' ', '-') 
ORDER BY REPLACE(CONVERT(VARCHAR(32), PingLogDate, 120), ' ', '-') 
+0

Das Problem zu trimmen ist es gib mir ist alles ping (alle 10 Sek), ist es nicht das, was Ich will. Ihre Ausgabe ist CalculatedTime | PingCount 2017-11-07-12: 20: 03 | 1 2017-11-07-12: 20: 13 | 1 Das ist jetzt, was ich will – BMErEr

0

Probieren Sie diese Methode mit convert und Verkettung von Stunden. Dies werden Ihnen für jede Stunde und Datetime-Format gleichen Ping-Zählung geben, wie Sie FORMAT Methode in SQL Server wurden mit 2012:

SELECT REPLACE(CONVERT(CHAR(10), date_field, 120),' ','-') + '-' + RIGHT('0' + CONVERT(VARCHAR(2), DATEPART(HOUR, date_field)), 2) + ':00:00' as CalculatedTime, 
COUNT(PingLogID) AS PingCount 
FROM tbl_PingLog 
GROUP BY REPLACE(CONVERT(CHAR(10), date_field, 120),' ','-') + '-' + RIGHT('0' + CONVERT(VARCHAR(2), DATEPART(HOUR, date_field)), 2) + ':00:00' 
ORDER BY REPLACE(CONVERT(CHAR(10), date_field, 120),' ','-') + '-' + RIGHT('0' + CONVERT(VARCHAR(2), DATEPART(HOUR, date_field)), 2) + ':00:00' 
+0

Obwohl es nur eine modifizierte Version der Antwort von @gotqn: P –

+0

Ja, es funktioniert gut, aber ich will nicht aus Datum/Datetime-Format gehen. Ich kann es auf C# -Seite mit String-Format tun. Es ist nicht was ich genau will. Aber es funktioniert, danke. – BMErEr

+0

@BMErEr Markieren Sie immer die Antwort "Beantwortet" oder "Hoch", wenn jemand Ihre Frage beantwortet. –

0

Vereinfachte Version von anderen Lösungen

SELECT 
    replace(convert(varchar(13),PingLogDate,120),' ','-')+':00:00' AS CalculatedTime, 
    COUNT(PingLogID) AS PingCount 
FROM 
    tbl_PingLog 
GROUP BY 
    convert(varchar(13),PingLogDate,120) 
ORDER BY CalculatedTime 
+0

wie ich sagte Nitin_g3 "ich will nicht out of date/datetime format. Ich kann es auf C# -Seite mit String-Format. Es ist nicht das, was ich genau will." – BMErEr

+0

Sehen Sie sich https://docs.microsoft.com/ de-de/sql/t-sql/funktionen/format-transact-sql. Rückgabetypen von ** Format ** sind ** nvarchar ** und ** null **. Selbst Ihre erste Lösung gibt Datum-Zeit nicht zurück. Und yyyy-MM-dd-HH: 00: 00 ist kein gültiges Datetime-Format. Wenn Sie möchten, dass es datetime ist, sollten Sie es zurück in datetime konvertieren.Wie cast (convert (varchar (13), b_datetime, 120) + ': 00:00' als datetime) – uzi

0

, was diese über die Verwendung von einfache Aussage in Ihrem Code?

declare @date datetime = getdate() 
select DATEADD(dd, DATEDIFF(dd, 0, @date), 0) 

Ergebnis wird sein, wie 2017-11-25 00:00:00.000

Dies ist der beste Weg, um die Zeit von der datetime Feld

+0

Ich möchte die Zeit nicht von datetime abschneiden. Aber wenn ich das machen will, werde ich das tun (Mydate als Date) – BMErEr

Verwandte Themen