#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.