2012-07-27 4 views
0

Nous utilisons MySQL comme base de données pour stocker des messages avec des horodatages. Est-il possible de créer une requête qui renvoie les messages des n derniers jours de la semaine?Derniers n jours de la semaine en sql où clausel

I.e. si n est 4 et aujourd'hui c'est mardi, je veux des messages de cette semaine lundi, les dernières semaines vendredi, les dernières semaines jeudi et les dernières semaines mercredi.

Répondre

2

Si vous voulez le faire directement avec MySQL serait un peu compliqué. Comme Vatev vous recommandé devez calculer la date d'étoile de date à l'avance, mais si vous voulez vraiment faire cela, vous aurez probablement besoin de fonctions suivantes:

F IRST de tout ce que vous avez besoin devrait compter combien de semaines, vous devriez revenir en arrière, c'est facile ... Pour vous one week = 5 days, cela signifie

weeks = FLOOR(days/5) 

Nous avons pris soin de semaines, donc nous allons maintenant travailler avec le reste:

rest = days MOD 5 

maintenant, nous avons deux cas, le week-end a eu lieu ou non, pour le cas où il n'y avait pas de jours de week-end sont bons. Nous devons ajouter 2 jours pour l'ignorer. Le week-end a eu lieu si (WEEKDAY(now) - rest) < 0

rest = IF((WEEKDAY(now) - rest) < 0, rest + 2, rest) 

Et maintenant, nous pouvons construire une par (supposons que vous avez {days} et {rest} précalculée):

WHERE date >= ADD_DATE(
    ADD_DATE (
     {now}, 
     INTERVAL -IF((WEEKDAY({now}) - {rest}) < 0, {rest} + 2, {rest}) DAYS, 
    ), 
    INTERVAL -FLOOR({days}/5) WEEKS 
) 
+0

merci pour l'explication détaillée. Comme Vatev l'a souligné, je pense que je vais calculer le jour de départ dans ma demande pour mettre un peu de stress de la DB. – Thomas

+1

Le stress sur la base de données de cette opération sera négligeable, mais il y aura probablement beaucoup moins de stress pour vous si vous le faites dans une langue plus saine: P – Vatev

+0

@Thomas je l'ai écrit afin que je sois réutilisable pour toute autre langue , en particulier PHP accepte (dans ['strtotime'] (http://php.net/manual/fr/function.strtotime.php)) intervalles et la logique est la même. Vous pouvez même faire 'timestamp() - weeks * 7days * 24hour * 3600seconds' pour économiser quelques petites ressources. – Vyktor

0

Avez-vous essayé quelque chose dans quelque chose comme ça?

SELECT columns 
FROM table 
WHERE datediff(column_with_timestamp,NOW()) > n 

Où N est tel que vous l'avez défini ci-dessus, le nombre de jours que vous recherchez.

+0

jours semaine, sans compter les week-ends. – Vyktor

1

Le meilleur que je peux trouver est le calcul de la date de début ({start_date} dans la requête) dans la langue de votre choix, puis courir quelque chose comme ceci:

SELECT some_things 
FROM your_table 
WHERE 
    WEEKDAY(time_column) < 5 
    AND time_column >= {start_date} 
ORDER BY time_column DESC 

Vous pouvez faire un stocké fonction pour calculer 'la date x semaine jours auparavant' et l'utiliser pour {start_date}.

+0

Très bonne suggestion, merci. – Thomas

0
COL >= date_sub(NOW(), interval 1 week) and 
weekday(COL) < 5 
  • DATE_SUB est de rechercher des lignes créées la semaine dernière
  • semaine est d'exclure dimanche ou samedi
Questions connexes