조회 시 날짜로 조회 하는데 오늘 날자 데이터는 안가져오는 건 어떻게 처리해야하나요? 0 9 3,355

by Vampirejk [2013.07.30 09:59:19]


안녕하세요

c#으로 된 프로그램에서 날짜 선택하고 데이터를 가져오는데

날짜 부분쿼리는 아래와 같습니다.

근데 범위를 어제부터 오늘로 설정하고 조회를 하면 (29~30) 30일 데이터는 안나오고 31일로해야 30일 데이터가 나옵니다.

어떻게 수정을 해야 29~30일 지정했을 때 30일가지 나올까요

ㅠㅠ

 T_QUERY := T_QUERY || ' and C.TPT_INPUT_DATE >= ''' || p_DateS_tt || ''' and C.TPT_INPUT_DATE <= ''' || p_DateE_tt || '''';
by Vampirejk [2013.07.30 10:01:12]
비트윈을 써야하나요?

by 우리집아찌 [2013.07.30 10:06:40]

혹시 데이트 타입이시라면

http://www.gurubee.net/article/59492

by Vampirejk [2013.07.30 10:17:27]
T_QUERY := T_QUERY || 'and C.TPT_INPUT_DATE between TO_DATE(''' || p_DateS_tt || ''',' || '''YYYYMMDD''' || ')' ||  'and TO_DATE(''' || p_DateE_tt || ''',' || '''YYYYMMDD''' || ') +1' ;

이런 식으로 변경을 하였습니다.

형식은 DATE 타입입니다.

지정한 월이 부족하다.. 라고 에러가 나는데 원인이 뭐죠?

by 우리집아찌 [2013.07.30 10:28:52]
입력값이 DATE 형식에 안맞을때 나오던데요.. 흠..

by Vampirejk [2013.07.30 10:29:51]
'29-7월-13' 이런식으로 날짜가 들어가는게 문제인가요?

by 마농 [2013.07.30 10:44:59]
'29-7월-13' 은 'dd-mon-yy' 형식인데...
TO_DATE('29-7월-13', 'dd-mon-yy') 하면 되지만 다른 나라 가면 에러납니다.
TO_DATE('29-7월-13', 'dd-mon-yy', 'nls_date_language=korean') 해야만 다른나라에서도 통합니다.
입력형식은 군더더기 하나 없고 어디서나 통용되는 yyyymmdd 추천합니다.
그리고 + 1 로 Between 하시면 범위가 정확하지 않습니다.
다음날 0시0분0초까지 포함되죠. 정확하게 23시59분59초까지 범위를 주세요.
+ 1 대신 + 0.99999 하시던가...
+ 1 을 그대로 사용하실 거면 뒤 조건엔 등호(=)를 빼셔야 합니다.
   AND c.tpt_input_date >= TO_DATE(:p_DateS_tt, 'yyyymmdd')
   AND c.tpt_input_date <  TO_DATE(:p_DateE_tt, 'yyyymmdd') + 1

by 마농 [2013.07.30 10:32:29]

일자까지만 저장되어 있다면 맞겠지만
시분초 단위까지 저장되어 있다면 틀렸죠.
사용하신 조건은 29일 0시0분0초 ~ 30일 0시0분0초 까지입니다.
30일 0시0분1초 ~ 30일 23시59분59초 까지가 누락될수밖에 없는 조건이죠.
29일 0시0분0초 ~ 30일 23시59분59초 까지로 조건을 주셔야 합니다.


이 때.. 주의할 것은 날짜 항목의 데이터 형에 따라 조건을 주는 방법이 다릅니다.
1. VARCHAR2(14) 인 경우
   AND c.tpt_input_date >= :p_DateS_tt
   AND c.tpt_input_date <= :p_DateE_tt || '235959'
2. DATE 인 경우
   AND c.tpt_input_date >= TO_DATE(:p_DateS_tt, 'yyyymmdd')
   AND c.tpt_input_date <= TO_DATE(:p_DateE_tt || '235959', 'yyyymmddhh24miss')


그런데...
입력 인자들을 그대로 스트링으로 붙이는 방식은 좋지 않습니다.
보안상 문제(SQL Injection 해킹)도 있고, 성능상(Hard Parsing) 문제도 있습니다.
바인드 변수를 사용하도록 권장합니다.


by Vampirejk [2013.07.30 11:10:07]
쿼리를 아래와 같이 수정하여 oracle 상에서 쿼리를 실행해보니 정상적으로 나왔습니다.

근데 프로그램단에서 실행을 하니 오류가 발생을 합니다.

ora- 03113 이라는 오류가 발생하는데 원인을 모르겠네요 쿼리에 문제가 있는건가요>? 

 T_QUERY := T_QUERY || 'and C.TPT_INPUT_DATE between TO_DATE(''' || p_DateS_tt || ''',' || '''dd-mon-yy''' ||',' || '''nls_date_language=korean'')' || 
                                   'and TO_DATE(''' || p_DateE_tt || ''',' || '''dd-mon-yy''' || ',' || '''nls_date_language=korean'')+1' ;

by Vampirejk [2013.07.30 11:57:12]
두 분 모두 감사합니다 ^^

사실 이렇게 처리 했네요

T_QUERY := T_QUERY || ' AND C.TPT_INPUT_DATE >= to_DATE(''' || p_DateS_tt || ''') AND C.TPT_INPUT_DATE < to_DATE(''' || p_DateE_tt || ''') + 1 ';

감사합니다
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입