Serveur de table Oracle offre une fonction de intégrée, TRUNC(timestamp,'DY')
. Cette fonction convertit n'importe quel horodatage en minuit le dimanche précédent. Quelle est la meilleure façon de faire cela dans MySQL?
Oracle propose également TRUNC(timestamp,'MM')
de convertir un horodatage en minuit le premier jour du mois au cours duquel il se produit. Dans MySQL, celui-ci est simple:
TIMESTAMP(DATE_FORMAT(timestamp, '%Y-%m-01'))
Mais cette DATE_FORMAT
astuce ne fonctionnera pas pendant des semaines. Je connais la WEEK(timestamp)
fonction, mais je ne veux vraiment pas de numéro de semaine dans l'année; ce truc est pour un travail pluriannuel.
TRUNC(date, 'DY' )
obtient des semaines avec un début dimanche.'W'
commence le lundi, du moins dans mon système.Réponses:
Vous pouvez utiliser à la fois
YEAR(timestamp)
etWEEK(timestamp)
et utiliser ces deux expressions dansSELECT
laGROUP BY
clause et.Pas trop élégant, mais fonctionnel ...
Et bien sûr, vous pouvez également combiner ces deux parties de date dans une seule expression, c'est-à-dire quelque chose comme
SELECT CONCAT(YEAR(timestamp), '/', WEEK(timestamp)), etc... FROM ... WHERE .. GROUP BY CONCAT(YEAR(timestamp), '/', WEEK(timestamp))
Edit : Comme le souligne Martin , vous pouvez également utiliser la
YEARWEEK(mysqldatefield)
fonction, bien que sa sortie ne soit pas aussi conviviale que la formule plus longue ci-dessus.Edit 2 [3 1/2 ans plus tard!]:
YEARWEEK(mysqldatefield)
Avec le deuxième argument optionnel (mode
) mis à 0 ou 2 est probablement le meilleur moyen d'agréger par semaines complètes (c'est-à-dire y compris pour les semaines qui chevauchent le 1er janvier), si c'est ce qui est souhaité. L'YEAR() / WEEK()
approche initialement proposée dans cette réponse a pour effet de diviser les données agrégées pour ces semaines «chevauchantes» en deux: une avec l'année précédente, une avec la nouvelle année.Une coupe nette chaque année, au prix d'avoir jusqu'à deux semaines partielles, une à chaque extrémité, est souvent souhaitée en comptabilité, etc. et pour cela l'
YEAR() / WEEK()
approche est meilleure.la source
YEARWEEK()
résultats dans unINT(6)
qui, je crois, sera plus rapide à trier / rejoindre / grouper avecLa réponse acceptée ci-dessus n'a pas fonctionné pour moi, car elle a ordonné les semaines par ordre alphabétique, pas par ordre chronologique:
Voici ma solution pour compter et regrouper par semaine:
SELECT CONCAT(YEAR(date), '/', WEEK(date)) AS week_name, YEAR(date), WEEK(date), COUNT(*) FROM column_name GROUP BY week_name ORDER BY YEAR(DATE) ASC, WEEK(date) ASC
Génère:
la source
ORDER BY date ASC
) devrait faire l'affaire aussiJe l'ai compris ... c'est un peu encombrant, mais le voici.
Et, si les règles de votre entreprise indiquent que vos semaines commencent le lundi, remplacez le
-1
par-2
.Éditer
Les années ont passé et j'ai enfin réussi à écrire ceci. http://www.plumislandmedia.net/mysql/sql-reporting-time-intervals/
la source
Vous pouvez obtenir l'année concaténée et le numéro de semaine (200945) à l'aide de la fonction YEARWEEK () . Si je comprends bien votre objectif, cela devrait vous permettre de regrouper vos données pluriannuelles.
Si vous avez besoin de l'horodatage réel pour le début de la semaine, c'est moins agréable:
Pour la commande mensuelle, vous pouvez envisager la fonction LAST_DAY () - le tri serait effectué par le dernier jour du mois, mais cela devrait être équivalent au tri par premier jour du mois ... n'est-ce pas?
la source
Ajoutez simplement ceci dans la sélection:
Et
la source
Si vous avez besoin de la date de "fin de semaine", cela fonctionnera également. Cela comptera le nombre d'enregistrements pour chaque semaine. Exemple: Si trois bons de travail ont été créés entre (inclus) 1/2/2010 et 1/8/2010 et 5 ont été créés entre (inclus) 1/9/2010 et 1/16/2010, cela renverrait:
3 1/8/2010
5 1/16/2010
J'ai dû utiliser la fonction supplémentaire DATE () pour tronquer mon champ datetime.
SELECT COUNT(*), DATE_ADD( DATE(wo.date_created), INTERVAL (7 - DAYOFWEEK( wo.date_created )) DAY) week_ending FROM work_order wo GROUP BY week_ending;
la source