首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对一段时间内的每一天执行查询,将其转换为一个查询

对一段时间内的每一天执行查询,将其转换为一个查询
EN

Stack Overflow用户
提问于 2010-12-15 21:10:24
回答 3查看 1.1K关注 0票数 3

我有这个:

代码语言:javascript
复制
public Map<Day,Integer> getUniqueLogins(long fromTime, long toTime) {

  EntityManager em = emf.createEntityManager();
  try {
   Map<Day,Integer> resultMap = new ...;
   for (Day day : daysInPeriod(fromTime, toTime)) {

    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Long> q = cb.createQuery(Long.class);

    // FROM UserSession
    Root<UserSession> userSess = q.from(UserSession.class);
    // SELECT COUNT(DISTINCT userId)
    q.select(cb.countDistinct(userSess.<Long>get("userId")));
    // WHERE loginTime BETWEEN ...
    q.where(cb.between(userSess.<Date>get("loginTime"), day.startDate(), day.endDate()));

    long result = em.createQuery(q).getSingleResult();
    resultMap.put(day, (int) result);
   }
   return resultMap;
  } finally {
   em.close();
  }

 }

这将执行给定时间段(该时间段的数量级为一个月)内的每一天的查询。

我可以在一个查询中获得这个特定的数据吗?我使用的是Hibernate/MySQL,但我不希望使用任何非标准函数。

EN

回答 3

Stack Overflow用户

发布于 2010-12-15 22:05:32

假设您的原始查询为:

代码语言:javascript
复制
SELECT COUNT(DISTINCT userId)
FROM UserSession
WHERE loginTime BETWEEN dayStart AND dayEnd;

这应该会返回与该时间段中每天运行一个原始结果相同的结果:

代码语言:javascript
复制
SELECT date(loginTime) AS day, COUNT(DISTINCT userId)
FROM UserSession
WHERE loginTime BETWEEN startDate AND endDate
GROUP BY day;
票数 2
EN

Stack Overflow用户

发布于 2010-12-15 22:00:18

按LoginTime的日期段分组,计算不同的用户of。后端应该提供一种方法来提取日期时间值的日期部分。

票数 1
EN

Stack Overflow用户

发布于 2011-01-09 07:09:10

您必须使用特定于MySQL的函数来完成此操作。

代码语言:javascript
复制
SELECT FROM_DAYS(TO_DAYS(loginTime)) AS day, COUNT(DISTINCT userId)
FROM UserSession
WHERE loginTime BETWEEN :fromTime AND :toTime
GROUP BY day

from_ days / to _days会将loginTime转换为若干天,然后再转换回日期时间,但小时/分钟/秒部分为零。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4450218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档