2012-04-27 2 views
0

쿼리의 데이터를 표시하는 화면이 있습니다. 이 쿼리는 프로세스에서 재료의 일일 생산량을 수집한다고 가정합니다. 쿼리는 다음과 같습니다 :모든 데이터를 수집하지 않는 쿼리

Select SUM(ltv.val) "CE" FROM LADLE_TAP_VALUE ltv, LADLE_TAP_ID lti where ltv.id=108 AND ltv.ladletapid =lti.ladletapid and lti.tapid IN (Select ti.TapID FROM tap_index ti WHERE ti.tapno like 'CE%' AND ti.starttime>=to_date('20120426', 'yyyymmdd hh24:mi:ss') and ti.endtime<=to_date('20120427 00:00:00', 'yyyymmdd hh24:mi:ss')); 

내가 직면하고 문제는 STARTTIME 어느 날의 끝 부분이며, 종료 시각이 다음날의 첫 번째 시간 동안은 가끔 있다는 점이다. 내 쿼리의 시간 처리 부분으로 조정하는 방법을 잘 모르겠습니다. 매일 거기에 있어야하는 디스플레이에서 제작물을 잃어 버리기 때문에 이것은 문제입니다.

tap_index table 
tapid tapno plant taphole drytap status startime endtime slagstart readytime 
21437 CN121348 1 1 1 0 26-APR-12 06:00:26 26-APR-12 07:42:41 26-APR-12 06:56:34 26-APR-12 06:00:00 
21436 CE121347 1 2 1 0 26-APR-12 03:21:10 26-APR-12 05:40:48 26-APR-12 04:39:27 26-APR-12 03:21:00 
21435 CN121346 1 1 1 0 26-APR-12 01:48:07 26-APR-12 03:01:23 26-APR-12 02:27:34 26-APR-12 01:48:00 
21434 CE121345 1 2 1 0 25-APR-12 23:27:23 26-APR-12 01:28:08 26-APR-12 00:44:09 25-APR-12 23:27:00 
21433 CN121344 1 1 1 0 25-APR-12 21:18:24 25-APR-12 23:07:17 25-APR-12 22:31:04 25-APR-12 21:18:00 
21432 CE121343 1 2 1 0 25-APR-12 19:55:08 25-APR-12 20:58:59 25-APR-12 20:22:39 25-APR-12 19:55:00 
21431 CN121342 1 1 1 0 25-APR-12 18:09:28 25-21422 CE121333 1 2 1 0 24-APR-12 22:56:17 25-APR-12 00:29:23 24-APR-12 23:32:27 24-APR-12 22:56:00 

CN121332 21421 1 1 1 0 24 4 ~ 12 20시 49분 25초 24 4 ~ 12 22시 36분 37초 24 4 ~ 12 21시 59분 30초 24 4 월 12 20 : 49:00 21420 CE121331 1 2 1 0 24-APR-12 18:15:12 24-APR-12 20:30:16 24-APR-12 19:19:42 24-APR-12 18:15:00 21419 CN121330 1 1 0 24-APR-12 16:06:06 24-APR-12 17:55:12 24-APR-12 17:02:33 24-APR-12 16:06:00 21418 CE121329 1 2 1 0 24-APR-12 14:04:36 24-APR-12 15:44:40 24-APR-12 14:50:33 24-APR-12 14:04:00

+0

스키마, 샘플 데이터 및 원하는 출력을 제공하십시오. – RedFilter

답변

3

나타납니다. 주어진 날짜에 모든 레코드를 가져 오는 중입니다. 일반적으로 가장 좋은 방법은이 논리를 가진 쿼리를 구성하는 것입니다

  • 하여 DateField < TRUNC (: 종료 날짜) + 1 (: STARTDATE) 귀하의 종료 날짜
  • 하여 DateField> = TRUNC 후 하루 전에 모든 기록을 얻을 : StartDate 시작 또는 그 이후의 모든 레코드를 얻으십시오.

"trunc"여기에는 종종 이와 같은 쿼리의 매개 변수화 된 입력에 시간 부분이 포함되어 있기 때문에 언급합니다. trunc은 날짜에서 시간 부분을 제거합니다.

예를 들어, 쿼리가 다음과 같이 읽을 수 있다고 생각합니다. 단순히 "< ="대신 "<"을 사용하도록 "ti.endtime"을 변경 했으므로 처음부터 레코드를 얻지 못합니다. 4 월 27 일.

Select SUM(ltv.val) "CE" 
    FROM LADLE_TAP_VALUE ltv, LADLE_TAP_ID lti 
where ltv.id=108 
    AND ltv.ladletapid =lti.ladletapid 
    and lti.tapid IN (Select ti.TapID 
         FROM tap_index ti 
         WHERE ti.tapno like 'CE%' AND ti.starttime>=to_date('20120426', 'yyyymmdd hh24:mi:ss') and ti.endtime < to_date('20120427 00:00:00', 'yyyymmdd hh24:mi:ss')); 
+0

의도하지 않은 오해의 소지가 있었을 수 있습니다. 시작 날짜가 전날 시작일이고 종료 시간이 오늘 날짜 인 경우 X 일 동안 데이터를 가져 오는 모든 데이터를 캡처하고 싶습니다. 의미는 ti.starttime이 04132012 23:10:13이고 ti.endtime이 04142012 01:32:21 인 경우 데이터를 가져오고, 내 쿼리가 04142012의 모든 데이터를 원한다면 의미합니다. –

0

ti.starttime >= $start and ti.endtime <= $end은 [$ start .. $ end] 내에 완전히 들어 맞는 모든 범위를 선택합니다.

ti.endtime >= $start and ti.starttime <= $end은 어떻게 든 [$ start .. $ end]와 교차하는 모든 범위를 선택합니다.

관련 문제