jpql:从毫秒开始按月分组

jpql: group by month from milliseconds

我想获取每月的新用户数。月份应由该月第一天在 0:00h.

处的 UTC 时间戳(以毫秒为单位 Long)表示

这种方法可以解释我想做什么:

实体

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 使用什么,即我们如何从 group by 子句中的 createdAt 字段中得出月份的开始。应该怎么办 @Query长什么样子?

我认为这在 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();