MySQL выбирает записи за последние 2 дня определенной недели / месяца

#php #mysql #sql #date

#php #mysql #sql #Дата

Вопрос:

Я получил 2 столбца: «create_time» — это когда учетная запись была зарегистрирована, а «last_play» — когда учетная запись вошла в систему в последний раз. Я хочу выбрать учетные записи, которые были зарегистрированы на определенной неделе / месяце и были активны в течение последних 2 дней этой конкретной недели / месяца.

Вот как я выбираю ВСЕ записи прошлой недели без учета last_play (работает):

 SELECT COUNT(id) FROM account.account 
WHERE WEEKOFYEAR(create_time) = WEEKOFYEAR(NOW()) - 1 
AND YEAR(create_time) = YEAR(NOW());
  

Это мой текущий запрос за прошлую неделю, который не работает:

 SELECT COUNT(id) FROM account.account 
WHERE WEEKOFYEAR(create_time) = WEEKOFYEAR(NOW()) - 1 
AND YEAR(create_time) = YEAR(NOW()) 
AND DATE(last_play) BETWEEN 
    ADDDATE(DATE(DATE_SUB(NOW(), INTERVAL 1 WEEK)), 
    INTERVAL 1 - DAYOFWEEK(DATE(NOW())) DAY) 
    AND DATE(NOW());
  

Комментарии:

1. Кажется, вы внесли правку, пока я отвечал. Не могли бы вы объяснить, что вы подразумеваете под «Я хочу выбрать учетные записи, которые были зарегистрированы на определенной неделе / месяце и были активны в течение последних 2 дней этой конкретной недели / месяца». Вы имеете в виду субботу и воскресенье этой конкретной недели?

2. Я просто отредактировал свой вопрос, чтобы сделать код более читаемым. Да, я имею в виду субботу и воскресенье этой недели. Я проверю ваш запрос сейчас!

Ответ №1:

Основываясь на вашем первом рабочем запросе, вы можете использовать функцию MySQL WEEKDAY для определения субботы и воскресенья:

 SELECT COUNT(id) FROM account.account 
WHERE WEEKOFYEAR(create_time) = WEEKOFYEAR(NOW()) - 1 
AND YEAR(create_time) = YEAR(NOW())
AND WEEKOFYEAR(last_play) = WEEKOFYEAR(create_time)  //last_play is in the same week as create_time
AND WEEKDAY(last_play) IN (5,6);  //wekkday is saturday or sunday
  

Это дает вам записи, которые были активны в субботу или воскресенье на той же неделе, на которой они были зарегистрированы.

РЕДАКТИРОВАТЬ: в течение нескольких месяцев вы в основном делаете то же самое, но заменяете WEEKOFYEAR MONTH WEEKDAY постепенно DAYOFMONTH . Последние два дня данного месяца вы можете найти вручную, проверив все возможные случаи:

 SELECT COUNT(id) FROM account.account 
WHERE MONTH(create_time) = MONTH(NOW()) - 1 
AND YEAR(create_time) = YEAR(NOW())
AND MONTH(last_play) = MONTH(create_time)  //last_play is in the same MONTH as create_time
AND 
   (DAYOFMONTH(last_play) IN (30,31) AND MONTH(last_play) IN (1,3,5,7,8,10,12)
    OR DAYOFMONTH(last_play) IN (29,30) AND MONTH(last_play) IN (4,6,9,11)
    OR DAYOFMONTH(last_play) IN (27,28) AND MONTH(last_play) IN (2))
  

Не обращайте внимания на високосный год ;-). Или включите его снова вручную самостоятельно.

Комментарии:

1. last_play >= DATE_SUB(NOW(), INTERVAL 2 DAY) с этого момента прошло всего 2 дня, но я хочу проверить последние 2 дня этой конкретной недели.

2. Спасибо, это то, что мне было нужно! Мне все еще нужно найти решение для месяцев, когда вы не знаете, какие дни недели являются последними 2.