2014-06-22 7 views
0

날짜 필드의 시간 구성 요소가 18:00에서 06:00까지의 범위 내에있는 레코드 수를 계산하는 Jasper 보고서 요구 사항이 있습니다. 다음 구조로 합계 된 변수를 만들었습니다.시간 범위가있는 레코드를 범위 내에서 계산하는 방법

new Integer((((new org.joda.time.DateTime($F{CCDateDis}).getHourOfDay()) > 18) && 
       ((new org.joda.time.DateTime($F{CCDateDis}).getHourOfDay()) < 6) 
) ? 1 : 0) 

여기서 $ F {CCDateDis}는 Date() 개체입니다.

이 범위에 속하는 레코드가 있음을 알고 있더라도 변수 합계는 항상 '0'을 반환합니다. 내가 여기서 누락 된 것이 있습니까?

+0

[허용 대답] (http://stackoverflow.com/a/24348312/642706)이 정확합니다. 하지만 별도의 문제는 시간대입니다. 이 코드는 DateTime을 구성 할 때 JVM의 기본 표준 시간대를 암시 적으로 적용합니다. 따라서 결과는 다양한 컴퓨터에서 다를 수 있으며 호스트 OS 또는 JVM의 표준 시간대 설정이 변경되면 달라질 수 있습니다. 원하는 시간대를 생성자의 두 번째 인수로 지정하는 것이 좋습니다. –

+0

그건 좋은 지적입니다. 고마워요. 사실 이것은 환자가 급성 병동에서 정상 병실로 퇴원하는 시간에 관한 질문과 관련되어 있으므로 실제 시간 (시간대와 상관없이)이 중요합니다. 요점은 6.00 PM 이후에 방전이 더 높은 사망률과 연관되어 있다는 증거가 있다는 것입니다 ... 측면에 있지만 당신이 관심을 가질 것으로 생각 했었습니다 .. – skyman

+0

더 많은 이유가 시간대를 지정합니다. 컴퓨터/JVM의 기본값이 보고서의 결과를 변경하고 분석 *이 변경되면 *. 이는 시간대를 변경하고 위치 정보를 기반으로 시간대를 자동으로 설정하는 최신 운영체제에서도 발생할 수 있습니다 (그 위치가 항상 정확하지는 않음). 명시적인 표준 시간대가없는 날짜/시간 데이터로 작업하는 것은 명시 적으로 화씨 또는 섭씨인지 명시하지 않고 온도 데이터를 사용하는 것과 같습니다. –

답변

2

비교를 취소하십시오.

당신의 논리는 기본적으로 :

x > 18 && x < 6 

이 수학적으로 항상 false입니다 - 모두 큰 18 미만 6

이상 변경 논리에 아니 수 없습니다 :

x <= 18 && x >= 6 
+0

그건 당황 스럽네! 나는 24 시간 주기로 일하는 것이 혼란 스럽기 쉽다고 생각합니다. 고맙습니다. – skyman

관련 문제