Как получить за прошлую и текущую неделю - PullRequest
1 голос
/ 21 июня 2020

Как мне получить данные за прошлую неделю из времени понедельника (00:00:01) и завершить в воскресенье (23:59:59) ... так же, как на этой неделе, из времени понедельника (00:00:01) и закончится в воскресенье (23:59:59)

Что я пробовал!

$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 ";

Ответы [ 3 ]

1 голос
/ 21 июня 2020

Вы находитесь на правильном пути, избегая таких функций, как week() в столбце - это просто сбивает оптимизатор с толку. С другой стороны, параметр uid должен передаваться как параметр , а не изменять строку запроса.

Вы хотите использовать функцию weekday(), потому что хотите, чтобы недели начинались в понедельник. Просто некоторая архаичность MySQL: weekday() возвращает 0 для понедельника, тогда как dayofweek() возвращает 2 для понедельника.

Итак, logi c для текущей недели будет:

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

Для прошлой недели это будет:

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

Обратите внимание, что curdate() (или current_date) возвращает текущую дату без компонента времени, поэтому date() не требуется.

0 голосов
/ 21 июня 2020

Вы можете использовать функцию WEEK(), которая возвращает номер недели для данной даты, добавив

AND WEEK(date-INTERVAL 1 DAY) = WEEK(NOW()) - 1, чтобы получить данные за текущую неделю, начиная с понедельника по воскресенье,

и

AND WEEK(date-INTERVAL 1 DAY) = WEEK(NOW()) - 2 для данных предыдущей недели

в условие WHERE после WHERE uid=$uid

, например

$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 "; 

и замените WEEK(NOW()) - 1 на WEEK(NOW()) - 2, а также

Демо

0 голосов
/ 21 июня 2020

Пара способов сделать это ...

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...