0

アプリケーションで従業員の勤務/休暇枠を計算する必要があります。

休暇にはstartDateとendDateがあります。ユーザーは一定期間を指定でき、その期間のユーザーの勤務時間枠と休暇枠を使用してレポートを生成する必要があります。

たとえば、ユーザーの休暇が3.02.2013〜4.02.2013で、検索期間が1.02.2013〜28.02.2013であるとします。

レポートは次のようになります。

  • 2013年2月1日-仕事

  • 2013年3月42日-休暇

  • 2013年2月5日-仕事

これを効率的に行う方法がわかりません。期間中の休暇を取得するための私の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 に答える