2011-08-09 5 views
41
create table #Events 
(
    EventID int identity primary key, 
    StartDate datetime not null, 
    EndDate datetime not null 
) 
go 
insert into #Events (StartDate, EndDate) 
select '2007-01-01 12:44:12 AM', '2007-01-01 12:45:34 AM' union all 
select '2007-01-01 12:45:12 AM', '2007-01-01 12:46:34 AM' union all 
select '2007-01-01 12:46:12 AM', '2007-01-01 12:47:34 AM' union all 
select '2007-01-02 5:01:08 AM', '2007-01-02 5:05:37 AM' union all 
select '2007-01-02 5:50:08 AM', '2007-01-02 5:55:59 AM' union all 
select '2007-01-03 4:34:12 AM', '2007-01-03 4:55:18 AM' union all 
select '2007-01-07 3:12:23 AM', '2007-01-07 3:52:25 AM' 

(avec mes excuses à http://www.sqlteam.com/article/working-with-time-spans-and-durations-in-sql-server pour récolter leurs sql de base)Groupe SQL Server par nombre de DateTime par heure?

Je suis en train de trouver le nombre d'événements qui se sont produits en une heure, de sorte que le jeu de résultats ressemblerait à ceci:

2007-01-01  12:00  3 
2007-01-02  5:00  2 
2007-01-03  4:00  1 
2007-01-07  3:00  1 

J'ai joué avec dateadd et round et grouper mais ne pas l'avoir. Quelqu'un peut-il aider?

Merci.

Répondre

86

Que pensez-vous de cela? En supposant que SQL Server 2008:

SELECT CAST(StartDate as date) AS ForDate, 
     DATEPART(hour,StartDate) AS OnHour, 
     COUNT(*) AS Totals 
FROM #Events 
GROUP BY CAST(StartDate as date), 
     DATEPART(hour,StartDate) 

Pour pré-2008:

SELECT DATEADD(day,datediff(day,0,StartDate),0) AS ForDate, 
     DATEPART(hour,StartDate) AS OnHour, 
     COUNT(*) AS Totals 
FROM #Events 
GROUP BY CAST(StartDate as date), 
     DATEPART(hour,StartDate) 

Il en résulte:

ForDate     | OnHour | Totals 
----------------------------------------- 
2011-08-09 00:00:00.000  12  3 
+0

Désolé de poser des questions, mais laisse dire que nous avons 4ème colonne, il a des numéros, et que vous voulez les résumer par heure par exemple à 12 heures, permet de dire que nous avons 6 rangs et chacun a 5 pomme donc il soit 30. – user206168

+0

Ajouter après Totaux ", SUM (pomme) en tant que pommes" – Loren

16

Sinon, il suffit GROUP BY l'heure et le jour:

SELECT CAST(Startdate as DATE) as 'StartDate', 
     CAST(DATEPART(Hour, StartDate) as varchar) + ':00' as 'Hour', 
     COUNT(*) as 'Ct' 
FROM #Events 
GROUP BY CAST(Startdate as DATE), DATEPART(Hour, StartDate) 
ORDER BY CAST(Startdate as DATE) ASC 

sortie:

StartDate Hour Ct 
2007-01-01 0:00 3 
2007-01-02 5:00 2 
2007-01-03 4:00 1 
2007-01-07 3:00 1 
8

Je l'ai trouvé ailleurs. J'aime cette réponse!

SELECT [Hourly], COUNT(*) as [Count] 
    FROM 
(SELECT dateadd(hh, datediff(hh, '20010101', [date_created]), '20010101') as [Hourly] 
    FROM table) idat 
GROUP BY [Hourly] 
+0

Pourrait avoir besoin d'une commande par [horaire] si créer une chronologie – aggaton

+0

Quelle serait la requête MySQL pour ce qui précède? – Biranchi