2010-10-18 6 views
7

J'ai besoin de calculer les semaines à partir d'une date dans ma déclaration de sélection MySQL. Il y a une colonne de date dans l'une des tables, et je dois calculer combien de semaines la date est.MySQL: Comment calculer des semaines à partir d'une date précise?

SELECT EventDate, (calculation) AS WeeksOut FROM Events; 

Exemple:

  • 6 jours de suite, semaines out = 0
  • 7 jours de suite, semaines out = 1
  • 13 jours de distance, semaines out = 1
  • 14 jours absent, semaines dehors = 2
+0

Que voulez-vous faire pour les semaines partielles? Par exemple: 3.2857 semaines devraient être 3 semaines, 4 semaines ou quelque chose entre les deux? –

+0

Oui, il devrait être arrondi à la semaine entière – Andrew

Répondre

17

Utilisez le DATEDIFF function:Le problème avec WEEKS est qu'il ne retournera pas les résultats corrects pour les dates qui se croisent au 1er janvier. Le 0 est le nombre de décimales à utiliser dans la fonction ROUND.

+1

+1 Bon point sur le problème de la nouvelle année, n'avait pas pensé à cela ... –

+0

Plus un Mais pouvez-vous ajouter le lien vers la documentation pour de meilleures explications. Pourquoi le 0 après le 7? –

+1

@JohnMax: Ajout d'infos sur le 0. –

3

Voici une façon simple de le faire:

SELECT EventDate, (week(EventDate) - week(curdate())) AS WeeksOut FROM Events; 

Exemple:

mysql> select week('2010-11-18') - week ('2010-10-18'); 
+------------------------------------------+ 
| week('2010-11-18') - week ('2010-10-18') | 
+------------------------------------------+ 
|          4 | 
+------------------------------------------+ 
1 row in set (0.00 sec) 

Une autre option est de calculer l'intervalle en jours et diviser par 7:

SELECT EventDate, datediff(EventDate,curdate())/7 AS WeeksOut FROM Events; 

Exemple:

mysql> select datediff('2010-11-18' , '2010-10-18')/7; 
+-------------------------------------------+ 
| datediff('2010-11-18' , '2010-10-18')/7 | 
+-------------------------------------------+ 
|         4.4286 | 
+-------------------------------------------+ 
1 row in set (0.00 sec) 
+0

Belle explication +1 de mon côté – w3uiguru

2

Afin de passer l'ensemble du "Nouvel An" problème et vous voulez toujours utiliser WEEK(), j'ai trouvé la méthode suivante assez efficace.

SELECT 
    YEAR(end_date)*52+WEEK(end_date) 
    - YEAR(start_date)*52 - WEEK(start_date) as weeks_out 
FROM 
    events; 

La différence avec ce procédé (par opposition à la méthode DATEDIFF) est qu'il est aligné avec la semaine. Donc aujourd'hui (qui est lundi) et vendredi dernier renverrait 1 en utilisant cette méthode, mais retournerait 0 avec la méthode DATEDIFF

Questions connexes