jpql: группа по месяцам от миллисекунд - PullRequest
0 голосов
/ 07 ноября 2018

Я хочу получить количество новых пользователей в месяц. Месяц должен указываться с помощью временной метки UTC (в мс, как Long) первого дня месяца в 0:00.

Этот подход может объяснить, что я хочу сделать:

Entity

class User {
    @NotNull
    private Long createdAt; // utc timestamp in ms
}

Репозиторий

public interface UserRepository extends CrudRepository<User, Long> {
    @Query("SELECT new UserRepository$NewUser(to_start_of_month_in_ms(user.createdAt), count(user.id)) "
        + "FROM User user "
        + "GROUP BY to_start_of_month_in_ms(user.createdAt) ")
    List<NewUser> findNewUsersPerMonth();

    @Getter
    @AllArgsConstructor
    public static class NewUser {
        private Long startOfMonth; // utc timestamp in ms
        private Integer count;
    }
}

Что можно использовать для to_start_of_month_in_ms, т. Е. Как мы можем получить начало месяца из поля createdAt в выражении group by. Что следует @Query похож?

1 Ответ

0 голосов
/ 08 ноября 2018

Я думаю, что это невозможно в JPQL, потому что он не поддерживает усечение даты и т. Д. Используя собственный запрос для PSQL, я придумал следующее:

public interface CountPerMonth {
    Integer getCount(); // count within the month
    Long getStartOfMonth(); // timestamp in ms
}

@Query(nativeQuery = true, value = ""
    + "SELECT COUNT(u.id) AS count, "
    + "  DATE_PART('EPOCH', DATE_TRUNC('MONTH',TO_TIMESTAMP(u.created_at/1000) AT TIME ZONE 'UTC'))*1000 AS startOfMonth "
    + "FROM user u "
    + "GROUP BY DATE_TRUNC('MONTH',TO_TIMESTAMP(u.created_at/1000) AT TIME ZONE 'UTC') "
    + "ORDER BY startOfMonth ")
List<CountPerMonth> findNewUsersPerMonth();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...