안녕하세요. 질문드립니다.
SELECT-OPTIONS 조건에서 Start 날짜/시간 과 End 날짜/시간이 있습니다.
이 조건을 아래 코딩과 같이 주었을때 날짜는 상관이 없지만 시간조건이 문제입니다.
예) Start를 2009.01.01 18:00:00 ~ End를 2009.01.02 07:00:00 주었을때
날짜는 맞게 조회가 되겠지만 시간은 입력부터 문제가 되고 Start에 시간과 날짜가 따로 논다는 겁니다. (End도 마잖가지..)
이 문제를 해결할 방법을 좀 알려주세요.
----------------------------------------------------------------------------
*--- select options...
SELECTION-SCREEN BEGIN OF BLOCK BOX3 WITH FRAME TITLE TEXT-008.
SELECT-OPTIONS: S_SDATE FOR BTCH2170-FROM_DATE NO-EXTENSION.
SELECT-OPTIONS: S_STIME FOR BTCH2170-FROM_TIME NO-EXTENSION
DEFAULT '000000' TO '235959'.
SELECTION-SCREEN END OF BLOCK BOX3.
.
.
.
SELECT * INTO CORRESPONDING FIELDS OF TABLE ITAB
FROM TBTCO
WHERE SDLSTRTDT IN S_SDATE
AND SDLSTRTTM IN S_STIME.
.
.
----------------------------------------------------------------------------
댓글 11
-
無念군
2009.02.16 18:21
-
erdfg
2009.02.16 18:35
date로 서브쿼리로 조건을 걸어 메인쿼리에서 시간으로 찾아내셔야 할 것 같으네요.
-
박하사탕
2009.02.18 02:23
째마니님 하신 얘기는 date : low-high 들어가야 되고 time : low-high가 들어가야 되는데,
예를 들어 date : 2009/01/01-2009/01/02 이고 time : 07:00~02:00 주면
1월1일 7시부터 1월2일 새벽2시까지 데이터를 가져오고 싶은건데... time에 low-high가 아닌 high-low가 되기때문에 Error가 난다는 거죠?
이해는 가는데 저 역시도 궁금하네요...^^;;
-
꼬맹이
2009.02.18 07:40
Range 가 관건이네요... 저두 숙제가 생겼습니다...
Time 은 심오하죠... erdfg 님 말씀 처럼 거시기 해 줘야 할거 같아요...~
꼭대기에 계신 無念군 님 시간을 Range 로도 후딱 가지고 오나요 ?
Validation 문제 없나요 ... 한수 부탁 드립니다.
-
無念군
2009.02.18 17:29
내가 왜 여따 저런 글을 달아놨을까 -_-;; 내심 제 자신에게 의문이 하하하..
저거 안되는거 같은데 .. 라고 생각을하면서도..
머 안되면 이리 하믄 되죠뭐..
시간 관련된 필드는 파라미터로 low,high 값을 받으시고
*일자가 동일할 경우
if S_SDATE-low = S_SDATE-high .
if S_STIME-LOW < s_STIME-high .
ERROR. "error massage 처리 해주시면 되고욤.
endif.
endif.
SELECT * INTO CORRESPONDING FIELDS OF TABLE ITAB
FROM TBTCO
WHERE SDLSTRTDT IN S_SDATE
* AND SDLSTRTTM IN S_STIME. "주석줄
AND SDLSTRTTM >= S_STIME-LOW
AND SDLSTRTTM =< S_STIME-HIGH.
로 수정 하시면 될듯 합니다 .
꼬맹이님// 아시겠쥐만 ㅋ
Range 변수 = SELECT-OPTIONS 과 동일 합니다..
OPTIONS = 'BT' 적용시엔 LOW > HIGH 는 입력이 안될겁니다..
OPTIONS = 'EQ' 적용시에는 되겠지만.
-
꼬맹이
2009.02.18 22:42
캬아~ 고맙습니다... (--)(__)
-
째마니
2009.02.20 05:48
無念군님 죄송하지만 Start 일과 End 일이 하루 차이면 상관이 없지만
예로 2009.01.01 18:00 ~ 2009.01.10 02:00 일 경우 어떻게 하죠..(10일)
위와 같이 select문으로 작성하면 1월1일은 18시간보다 크것(19,19,20,21,22,23)이 나올꺼고 1월 10일은 02시보다 작은것(01,00)나올 겁니다. 그럼 1월 2일~ 9일까지의 조건에 맞지 않는 (03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18)는 어떻게 합니까..? ㅜㅜ 위 방법으로는 해결이 되지 않네요..
제가 생각한것이 있는데 일단 해당 일자의 작업을 모두 불러와서 시작 일자의 시간보다 작은것은 짤라내고 마지막날에도 끝일의 시간 이후것을 짤라내는 방법 입니다.
이방법으로 하면 결과는 나오겠지만 추천할 방법은 아닌것 같네요.
한번더 답변 부탁 드립니다. 혹시 평션은 없는지요?
-
無念군
2009.02.20 22:13
확실한 답을 못드려서 죄송하네요 -_-;
능력이 부족하여서 ㅠ_ㅠ
일자 조건에 따라서 해당 time 값을 적절하게 setting 해주셔서 사용하시면 될듯 합니다 .
*조 건: 2009.01.01 18:00 ~ 2009.01.10 02:00
*일자 조건 SDLSTRTDT between SDLSTRTDT-LOW and SDLSTRTDT-HIGH 이므로 조건에 성공을 하게 되고
** WHERE SDLSTRTDT IN S_SDATE
* AND SDLSTRTTM >= '18:00:00'
* AND SDLSTRTTM =< '02:00:00'
*이므로 중간에서 데이터가 select 되지 않는다는 의미 신거죠??
*** 막 만들어 버린 프로그램이라 프로그램명이 이상한건 양해를 +_+
----------------▼▼아래 프로그램을 ▼▼------------------copy 하셔서 .. 적용해 보시길..
REPORT ZHRR_TEWSWTGJLASGJL .
TABLES : BTCH2170.
DATA : ITAB LIKE BTCH2170 OCCURS 0 WITH HEADER LINE.
*** 추가 변수 선언부 ******************************
DATA : S_LOW_START TYPE BTCH2170-FROM_TIME,
S_LOW_END TYPE BTCH2170-FROM_TIME,
S_HIGH_START TYPE BTCH2170-FROM_TIME,
S_HIGH_END TYPE BTCH2170-FROM_TIME,
L_CHECK(2) TYPE C.
***************************************************
*--- select options...
SELECTION-SCREEN BEGIN OF BLOCK BOX3 WITH FRAME TITLE TEXT-008.
SELECT-OPTIONS: S_SDATE FOR BTCH2170-FROM_DATE NO-EXTENSION.
*SELECT-OPTIONS: L2_TIME FOR BTCH2170-FROM_TIME NO-EXTENSION.
PARAMETERS : L_TIME TYPE BTCH2170-FROM_TIME.
PARAMETERS : H_TIME TYPE BTCH2170-FROM_TIME.
SELECTION-SCREEN END OF BLOCK BOX3.
************************************************************************
**** START-OF-SELECTION.
************************************************************************
START-OF-SELECTION.
CLEAR L_CHECK.
**-- 일자 관련 .. ERROR 처리 구문
**-- 말씀 드린대로.. 일자가 동일할 경우는 에러 처리 해주시구요
IF S_SDATE-LOW = S_SDATE-HIGH . "일자가 같을경우
IF L_TIME <= H_TIME . "타임이 크거나 같은경우
* "정상임..
L_CHECK = 'EQ'. "일자가 동일할경우 ...eq 변수 처리
ELSE.
CLEAR L_CHECK. "or l_CHECK = '00'. "ERROR 처리 되어서 Massasge 처리
ENDIF.
* ELSEIF S_SDATE-LOW > S_SDATE-HIGH .
** "select-otpins 변수 이므로 자체 검증 오류 처리됨.
ELSE. "S_SDATE-low < S_SDATE-high . "high가 클경우
PERFORM TIME_CREATE.
L_CHECK = 'GT'.
ENDIF.
CASE L_CHECK.
WHEN 'EQ'.
*** 일자가 같을 경우
SELECT * INTO CORRESPONDING FIELDS OF TABLE ITAB
FROM TBTCO
WHERE SDLSTRTDT IN S_SDATE
AND SDLSTRTTM >= L_TIME
AND SDLSTRTTM =< H_TIME.
WHEN 'GT'.
*** low < high 일경우
** 일자사이의 DATA all select.
SELECT * INTO CORRESPONDING FIELDS OF TABLE ITAB
FROM TBTCO
WHERE SDLSTRTDT > S_SDATE-LOW
AND SDLSTRTDT < S_SDATE-HIGH.
** low 일자의 해당 시간 이후의 DATA select 추가 append
SELECT * APPENDING CORRESPONDING FIELDS OF TABLE ITAB
FROM TBTCO
WHERE SDLSTRTDT = S_SDATE-LOW
AND SDLSTRTTM >= S_LOW_START
AND SDLSTRTTM <= S_LOW_END.
** high 일자의 해당 시간 이후의 DATA select 추가 append
SELECT * APPENDING CORRESPONDING FIELDS OF TABLE ITAB
FROM TBTCO
WHERE SDLSTRTDT = S_SDATE-LOW
AND SDLSTRTTM >= S_HIGH_START
AND SDLSTRTTM <= S_HIGH_END.
WHEN OTHERS.
*** 아마도 없겠죠??
ENDCASE.
************************************************************************
**** END-OF-SELECTION.
************************************************************************
END-OF-SELECTION.
*** 필요한 OUT_PUT_FORM 적용하시기 바랍니다 .
*&---------------------------------------------------------------------*
*& Form TIME_CREATE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM TIME_CREATE .
* 일자low <> 일자high
** and 일자low < 일자 high ( high 가 클경우)
CLEAR : S_LOW_START, S_LOW_END,
S_HIGH_START, S_HIGH_END.
* low 일자의 시간 조건 ..
IF L_TIME >= 000000 AND L_TIME <= 235959.
S_LOW_START = L_TIME.
S_LOW_END = 235959.
ENDIF.
* high 일자의 시간 조건 ..
IF H_TIME >= 000000 AND H_TIME <= 235959.
S_HIGH_START = H_TIME.
S_HIGH_END = 235959.
ENDIF.
ENDFORM. " TIME_CREATE
ENDFORM. " RANGE_CREATE -
째마니
2009.02.22 04:25
님 덕분에 문제는 해결 했습니다.
그런데 이런 방법밖엔 없는건지요.?
아무튼 신경 써 주셔서 정말 감사합니다.
저 또한 많이 배워서 다른분들께 많이 배풀겠습니다.
한번더 감사하다는 말씀 전합니다.
-
無念군
2009.02.23 17:28
째마니님이 사용하신 방법도 가능하기 하지만..
데이터를 가져와서 잘라 내려면.. 내부 루핑이 또 돌아야 하니..
에초에 가져올때 짤라서 가져다가 .. 내부 필요 루핑을 적용하는 방법을 추천 드립니다..
움.. TIME조건이라서.. 그외에 방법은 딱히 생각 나질 않네요...
최대한 DB access 부분을 줄여주고. 내부 루핑을 줄여 주는 방법이 ..
제일 좋을듯 해서요.. 내부적으로 변수 선언을해서 .. 작업 하는 방법을 추천 드립니다..
-
째마니
2013.02.15 01:24
네 감사합니다.
이해가 좀 +_+ 안되는데요 ..
따로 논다는게 무슨 말슴 이신지.. 댓글 부탁 드려요..
Query나 뭐 해본봐론 이상없이 데이터는 가져 오던데 ..