1
votes

Comment récupérer la semaine dernière et la semaine en cours

Comment récupérer les données de la semaine dernière à partir de l'heure du lundi (00:00:01) et terminer le dimanche (23:59:59) ... identique à cette semaine en cours à partir de l'heure du lundi (00:00:01) et se termine le dimanche (23:59:59)

CE que j'ai essayé!

$query = "SELECT users.name,count(*) as count, 
                 campaign.campaign_name, 
                 campaign.payout_cost*count(*) as totalPrice
            FROM users 
            JOIN transactions on users.uid=transactions.uid 
            JOIN campaign on campaign.campaign_id_id=transactions.campaign_id 
           WHERE uid=$uid 
             AND `date` >= DATE_SUB(DATE(NOW()), INTERVAL DAYOFWEEK(NOW())+6 DAY)   
             AND `date` <  DATE_SUB(DATE(NOW()), INTERVAL DAYOFWEEK(NOW())-1 DAY) 
           GROUP BY campaign.campaign_name_name ";


2 commentaires

Cela ressemble énormément à PHP combiné avec MySQL. Dans ce cas, vous devriez vraiment utiliser les déclarations préparées et les requêtes paramétrées en utilisant mysqli ou PDO. La structuration d'une requête avec une injection directe d'une variable (surtout si elle est basée sur une entrée) vous ouvre à une potentielle attaque par injection SQL (attaque SQLI).


J'apprends toujours 😁 mais de toute façon merci pour les conseils


3 Réponses :


0
votes

Deux façons de le faire ...

select data from tableName
where date between date_sub(now(),INTERVAL 1 WEEK) and now();

select data FROM tableName
wherdate >= curdate() - INTERVAL DAYOFWEEK(curdate())+6 DAY
AND date < curdate() - INTERVAL DAYOFWEEK(curdate())-1 DAY


0 commentaires

0
votes

Vous pouvez utiliser WEEK () , qui renvoie le numéro de semaine pour une date donnée, en ajoutant

AND WEEK (date-INTERVAL 1 DAY) = WEEK (NOW ()) - 1 code> pour obtenir les données de la semaine en cours du lundi au dimanche,

et

AND WEEK (date-INTERVAL 1 DAY) = WEEK (NOW ()) - 2 pour les données de la semaine précédente

dans la condition WHERE après WHERE uid = $ uid

comme p>

$query = "SELECT c.campaign_name,
                 COUNT(*) as total_count,
                 SUM(c.payout_cost) as total_payout
            FROM transactions t
            JOIN campaign c
              ON c.campaign_id = t.campaign_id
           WHERE uid = $uid
             AND WEEK(date - INTERVAL 1 DAY) = WEEK(NOW()) - 1               
           GROUP BY c.campaign_name "; 

et remplacer WEEK (NOW ()) - 1 par WEEK (NOW ()) - 2 , également

Démo


7 commentaires

il me donne "$ query =" vide sélectionnez count (*) comme count, sum (campaign.payout_cost) comme total des transactions rejoindre la campagne sur campaign.campaign_id = transactions.campaign_id WHERE uid = $ uid AND WEEK (date-INTERVAL 1 DAY ) = SEMAINE (MAINTENANT ()) - 1 ";"


idem ici "$ query =" select campaign.campaign_name, count (*) as total_count, sum (campaign.payout_cost) as total_payout from transactions join campaign on campaign.campaign_id = transactions.campaign_id WHERE uid = $ uid GROUP BY campaign_name AND WEEK ( date-INTERVAL 1 JOUR) = SEMAINE (MAINTENANT ()) - 1 ";"


J'ai dit que vous deviez ajouter dans la condition WHERE, pas dans la liste GROUP BY. J'ai édité @marcomasx, jetez un œil à cela s'il vous plaît.


Ok mon pote merci! Je l'ai essayé mais je me suis toujours laissé vide: (Je ne sais pas quel est le problème ..


C'est toute la requête


Toujours vide :( "$ query =" sélectionnez campaign.campaign_name, count (*) as total_count, sum (campaign.payout_cost) comme total_payout des transactions rejoindre la campagne sur campaign.campaign_id = transactions.campaign_id WHERE uid = $ uid AND WEEK ( date - INTERVAL 1 DAY) = SEMAINE (MAINTENANT ()) - 1 GROUP BY nom_campagne ";"


N'importe qui s'il vous plaît! Il retourne dans un vide $ query = "SELECT c.campaign_name, COUNT (*) as total_count, SUM (c.payout_cost) as total_payout FROM transactions t JOIN campaign c ON c.campaign_id = t.campaign_id WHERE uid = $ uid AND WEEK (date - INTERVAL 1 JOUR) = SEMAINE (MAINTENANT ()) - 1 GROUP BY c.campaign_name ";



1
votes

Vous êtes sur la bonne voie en évitant les fonctions comme week () sur la colonne - qui ne font que gâcher l'optimiseur. D'autre part, le paramètre uid doit être passé en tant que paramètre plutôt que de munging la chaîne de requête.

Vous voulez utiliser le jour de la semaine () parce que vous voulez que les semaines commencent un lundi. Juste un peu d'arcanisme de MySQL: week-end () renvoie 0 pour lundi alors que dayofweek () renvoie 2 pour lundi.

Donc, la logique pour la semaine en cours serait:

date >= curdate() - interval 7 + weekday(curdate()) day and
date < curdate() + interval - weekday(curdate()) day

Pour la semaine dernière, ce serait:

date >= curdate() - interval weekday(curdate()) day and
date < curdate() + interval 7 - weekday(curdate()) day


5 commentaires

J'ai essayé ça. Mais ne fonctionne pas "sélectionnez count (*) comme count, sum (campaign.payout_cost) comme total des transactions rejoindre la campagne sur campaign.campaign_id = transactions.campaign_id WHERE uid = $ uid AND 'dateTime'> = curdate () - intervalle de la semaine ( ) jour et 'dateTime'


Qu'est-ce que 'datetime' ? Cette syntaxe n'est pas correcte et il n'y a pas de guillemets simples dans cette réponse.


Donc, la valeur doit être date .. la dateTime est de la colonne .. donc c'est faux alors?


mais ça me donne du blanc


$ query = "sélectionnez campaign.campaign_name, count (*) as total_count, sum (campaign.payout_cost) as total_payout des transactions rejoindre la campagne sur campaign.campaign_id = transactions.campaign_id WHERE uid = $ uid AND date> = curdate () - interval jour de la semaine (curdate ()) jour et date