2010-09-14 7 views
6

j'ai eu une table de base de données qui ressemble à ceci:MySQL: semaine plage de dates à partir du numéro de la semaine dans une requête

| id   | clock   | info 
---------------------------------------------- 
| 1   | 1262556754 | some info 
| 2   | 1262556230 | some other info 
| 3   | 1262556988 | and another 
| 4   | 1262555678 | and some more 

Il contient des enregistrements de journaux et un horodatage unix, lorsque ce journal a été écrit. Ce dont j'ai besoin, c'est d'obtenir un rapport hebdomadaire sur le nombre d'enregistrements de journaux par semaine. Voici une requête que j'ai écrit:

SELECT 
    DATE_FORMAT(FROM_UNIXTIME(clock), "%U") AS week 
count(*) as cnt 
FROM logs 
WHERE DATE_FORMAT(FROM_UNIXTIME(clock), "%Y") = '2010' 
GROUP BY week 

Cela donne un résultat comme celui-ci:

| week  | cnt 
------------------------------- 
| 1   | 55 
| 2   | 134 
| 4   | 765 
| 20   | 65 

Great! Mais ce que je voudrais voir, est une plage de dates comme 08 Feb 2010 00:00 - 15 Feb 2010 00:00, donc mon jeu de résultat ressemblerait à ceci:

| day_start   | day_end   | cnt 
--------------------------------------------------------- 
| 08 Feb 2010 00:00 | 15 Feb 2010 00:00 | 55 
| 15 Feb 2010 00:00 | 22 Feb 2010 00:00 | 76 
| 22 Feb 2010 00:00 | 01 Mar 2010 00:00 | 756 

Est-il possible de le faire?

+1

Cette approche ne fonctionnera pas très bien si vous avez des données de différentes années dans la même table - '% U' donne le numéro de la semaine (où dimanche est le premier jour de la semaine) - le premier dimanche en 2009 serait 1, tout comme le premier dimanche de 2010. Vous pourriez avoir besoin d'une approche différente. Jetez un oeil à http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function%5Fyearweek –

+0

Mes rapports sont spécifiques à l'année, j'ai édité la question –

Répondre

6

Utilisez STR_TO_DATE('201008 Monday', '%X%V %W'); pour obtenir une date appropriée comme 2010-02-22 puis utilisez DATE_FORMAT pour obtenir le format dont vous avez besoin.

3

Si cette colonne "semaine" stocke le nombre d'une semaine donnée dans l'année, vous pouvez simplement la convertir en chaîne de date à l'aide de la fonction makedate.

par exemple:

select makedate(2010, week * 7); 

Il devrait fonctionner, étant donné que vos rapports sont spécifiques ans. Vive

+1

J'ai quelques données, en ce que nous avons une colonne load_date. Maintenant, je veux convertir la date en semaine. Dire load_date est de ** 2013-01-01 à 2013-01-07 **. Il devrait le retourner en semaine1.et du ** 2013-01-08 au 2013-01-15 **. Il devrait retourner le résultat en tant que semaine2 –

Questions connexes