0

我需要在我的应用程序中计算员工的工作/假期时段。

假期有一个 startDate 和一个 endDate。用户可以提供一个时间段,并且必须生成一个报告,其中包含该时间段内用户的工作和休假时段。

例如,用户从 3.02.2013 - 4.02.2013 休假,搜索时间为 1.02.2013 - 28.02.2013。

报告应如下所示:

  • 1-2.02.2013 - 工作

  • 3-4.02.2013 - 假期

  • 5-28.02.2013 - 工作

我不确定如何以有效的方式做到这一点。我在此期间获得假期的 DAO 方法如下:

public List<VacationRequest> getVacationsInPeriodForUser(Long userId,
        Date startDate, Date endDate) {
    List<VacationRequest> requests = getSessionFactory()
            .getCurrentSession()
            .createQuery(
                    "select req from VacationRequest req left join fetch req.vacationType where req.requestState.description = 'APPROVED' and req.user.id= ? and req.startDate >= ? and req.endDate <= ?")
            .setParameter(0, userId).setParameter(1, startDate)
            .setParameter(2, endDate).list();

    return requests;
}

但这在用户在整个供应期间都处于休假状态的情况下不起作用。例如,如果在上面的示例中搜索周期是 3.02.2013 - 4.02.2013。

谁能建议如何以有效的方式计算这些插槽?

4

1 回答 1

0

你想测试: req.startDate < endDate && req.endDate > startDate

您正在测试 req.startDate > startdate && req.endDate < endDate,这消除了在您的请求绑定之前和之后开始和结束的时间段。

编辑:假设您检查 startDates 总是在 endDates 之前

你的代码变成

public List<VacationRequest> getVacationsInPeriodForUser(Long userId,
        Date startDate, Date endDate) {
    List<VacationRequest> requests = getSessionFactory()
        .getCurrentSession()
        .createQuery(
                "select req from VacationRequest req left join fetch req.vacationType where req.requestState.description = 'APPROVED' and req.user.id= ? and req.startDate <= ? and req.endDate >= ?")
        .setParameter(0, userId).setParameter(1, enDate)
        .setParameter(2, startDate).list();

return requests;
}
于 2013-02-06T14:30:03.947 回答