Сгруппировать по дням месяца

Скажем, у меня есть таблица 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 06.05.2022 16:54

@Nathan_Sav Я подозревать, это правда, но на самом деле это не часть постановки задачи. Возможно, они также хотят знать, какие пользователи были первыми и последними каждый день. Кроме того, похоже, что об этом позаботится предложение WHERE, так что в любом случае будут учитываться только записи для конкретного пользователя.

Joel Coehoorn 06.05.2022 16:55

уверены ли вы? Я хочу знать эти операции только для одного пользователя за раз, а не для всех @Nathan_Sav

santocielo99 06.05.2022 16:56
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
3
33
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы были близки. Это будет выглядеть примерно так:

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

дб <> рабочий пример здесь

Другие вопросы по теме