2010-11-27 14 views
5

J'ai une table qui ressemble à cecigroupe Mysql DateTime de 15 minutes

CREATE TABLE `time_table` (
`id` INT(10) NOT NULL AUTO_INCREMENT, 
`creationDate` DATETIME NOT NULL, 
PRIMARY KEY (`id`) 
) 

je stocke essentiellement le temps de création de certains enregistrements de la table. Je sais que si je veux obtenir un nombre d'enregistrements qui ont été créés en 15 minutes d'intervalle, je vais utiliser quelque chose comme ça

SELECT FLOOR(UNIX_TIMESTAMP(creationDate)/900) AS t, 
COUNT(*) FROM time_table 
GROUP BY t 

Cela me donne quelque chose comme ça

t   COUNT(*) 
1434187 1 
1434188 3 
1434189 2 
1434190 2 

Comment puis-je faire sens de la première colonne? Si je veux me montrer quelque chose comme

t     COUNT(*) 
2:00pm - 2:15pm 1 
2:15pm - 2:30pm 3 
2:30pm - 2:45pm 2 
2:45pm - 3:00pm 2 

Je comprends que, avec une manipulation que je pouvais obtenir 1.434.187 de se présenter à 14h15. Même cela pourrait être un bon début ... alors, avec une certaine logique, je pourrais montrer toute la période. Merci!

Répondre

7

Une façon est d'utiliser simplement > et < afin d'obtenir tout dans une plage, mais vous pouvez trouver que cela soit plus simple:

SELECT ... 

GROUP BY (4 * HOUR(thistime) + FLOOR(MINUTE(thistime)/15)) 

de http://forums.mysql.com/read.php?10,202789,202807

+1

+1 pour la solution simple et propre, mais quelque chose se passe mal, le compte est incorrect ... (dans la sélection ...) et il ne fonctionne que pendant 24 heures ... – Dani

+0

@Dani - A quoi ressemble votre clause "where"? –

7

Voici la solution I utilisation:

SELECT FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(creationDate)/900) * 900) AS t, COUNT(*) FROM time_table GROUP BY t 

Bien qu'il arrive 4 ans plus tard, j'espère qu'il sera utile à quelqu'un.

5

La réponse 2 ne fonctionne que pendant 24 heures - essayez celle-ci;

SELECT ... 

GROUP BY year(date),month(date),day(date),(4 * HOUR(date) + FLOOR(MINUTE(date)/15))