Скажем, у меня есть таблица logins
только с bigint id
, date_login
типа datetime
и fk_user
типа bigint
. Мне нужно выбрать первый и последний вход в систему для каждого дня месяца в указанном году.
Я предполагал что-то вроде:
select *theDayOfTheMonth*,min(date_login), max(date_login)
from logins
where year(date_login) = *theYearInput* and
and fk_user = *theKeySpecified* and
month(date_login) = *theMonthInput*
group by *theDayOfTheMonth*
но я не знаю, как сгруппировать по этому дню месяца. Как я могу это сделать?
@Nathan_Sav Я подозревать, это правда, но на самом деле это не часть постановки задачи. Возможно, они также хотят знать, какие пользователи были первыми и последними каждый день. Кроме того, похоже, что об этом позаботится предложение WHERE, так что в любом случае будут учитываться только записи для конкретного пользователя.
уверены ли вы? Я хочу знать эти операции только для одного пользователя за раз, а не для всех @Nathan_Sav
Вы были близки. Это будет выглядеть примерно так:
SELECT DATE(date_login) as dayOfMonth, min(date_login), max(date_login)
FROM logins
WHERE year(date_login) = @theYearInput
and fk_user = @theKeySpecified
and month(date_login) = @theMonthInput
GROUP BY DATE(date_login)
В качестве альтернативы вы можете использовать вместо этого функция Day()
, который все равно должен работать, поскольку запрос ограничен одним конкретным месяцем с помощью условий в предложении WHERE:
SELECT DAY(date_login) as dayOfMonth, min(date_login), max(date_login)
FROM logins
WHERE year(date_login) = @theYearInput
and fk_user = @theKeySpecified
and month(date_login) = @theMonthInput
GROUP BY DAY(date_login)
Функционально, учитывая эти условия, единственная разница между ними заключается в формате первого столбца в выходных данных. Однако, если позже вам потребуется расширить диапазон дат, первая версия справится с этим лучше.
Функция, которую вы ищете, это DayOfMonth()
create table logins( fk_user bigint, date_login datetime); insert into logins values (1,'2022-01-01 09:00:00'),(1,'2022-01-01 18:00:00'),(1,'2022-01-02 08:00:00'),(1,'2022-01-02 16:00:00')
select DayOfMonth(date_login) day, min(date_login) first_login, max(date_login) last_login from logins where year(date_login) = 2022 and fk_user = 1 and month(date_login) = 1 group by DayOfMonth(date_login);
day | first_login | last_login --: | :------------------ | :------------------ 1 | 2022-01-01 09:00:00 | 2022-01-01 18:00:00 2 | 2022-01-02 08:00:00 | 2022-01-02 16:00:00
дб <> рабочий пример здесь
Вам также нужно будет сгруппировать по идентификатору пользователя.