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();
我想获取每月的新用户数。月份应由该月第一天在 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();