2013-04-24 4 views
0

내 스토어드 프로 시저에서 여러 날짜를 비교하고 있습니다. Oracle에서의 DateTime 비교

TODAY := TO_DATE(TO_CHAR(SYSDATE, 'DD-MON-YYYY') || 
      ' 09:00:00', 'DD-MON-YYYY HH24:MI:SS'); 

    IF PREVIOUS_DATE < TODAY AND 
     TO_DATE(CURRENT_DATE, 'DD-MON-YYYY HH24:MI:SS') >= TODAY THEN 
     -- do something 
    ELSE 
     -- do something else 

나는 그것이 IF 부분으로하지 않았다, CURRENT_DATE = SYSDATE을 설정합니다. 누군가 내가 어디에서 잘못했는지 말할 수 있습니까?

+2

왜'SYSDATE'를 먼저 문자 리터럴로 변환하여 나중에 다시 'DATE'로 변환합니까? 이는 전혀 쓸모가 없으며 다양한 NLS 환경에서 실패 할 수있는 'MON'형식으로 인해 발생합니다. 'today : = sysdate'는 훨씬 안전하고 정확합니다. 그리고'CURRENT_DATE'를 날짜로 변환하는 것은'to_date()'를 사용하여'DATE'로 변환하는 것은 쓸모가 없습니다. –

+0

@a_horse_with_no_name 가능한 경우 형식 마스크의 일부로 'MON'을 피하는 것이 좋습니다.이 경우 OP가 MON을 일관되게 사용하기 때문에 (이 경우에는 앞뒤로 변환이 수행되지 않는 한 모든 NLS 설정에서 작동해야합니다. 다른 NLS 설정을 가진 다른 세션에서) - 또는 나는 틀린가? –

+0

@a_horse_with_no_name 매개 변수 CURRENT_DATE에 대해 미안합니다. 오라클의 함수라는 것을 알지 못했습니다. 실제 매개 변수 이름은 CUR_DATE이므로 CURRENT_DATE로 다시 작성합니다. – noobie

답변

3

내 첫번째 생각 8)

를 배수구

"글쎄 CURRENT_DATE 유형 VARCHAR2입니다"그러나 나는 문제가 CURRENT_DATE의 사용에 생각합니다. 그것이 오라클 함수라고 가정하면 다음 두 가지 문제가 발생할 수 있습니다.

  1. CURRENT_DATE는 DATE 데이터 유형이므로 시간 요소가 있습니다. 데이트 할 때까지 주조 할 필요가 없습니다.
  2. CURRENT_DATE는 시스템 시간대에 맞게 조정 된 값을 반환합니다. 아마도 IF 테스트의 요점 일 것입니다. 그러나 가치가 무엇인지 아십니까?

그러나 디버깅 작업은 간단합니다. 값을 확인하여 현재 상황을 파악하십시오. 다음은 DBMS_OUTPUT (일명 Devil 's Debugger)을 사용하는 예제입니다. 더 나은 툴을 사용하는 환경에서 작업하고 있는지 알 수 없기 때문입니다.

TODAY := trunc(sysdate) + 9/24; 

dbms_output.put_line('TODAY = '||to_char(today, 'DD-MON-YYYY HH24:MI:SS')); 
dbms_output.put_line('PREVIOUS_DATE = '||to_char(previous_date, 'DD-MON-YYYY HH24:MI:SS')); 
dbms_output.put_line('CURRENT_DATE = '||current_date); 


IF PREVIOUS_DATE < TODAY AND 
    to_date(CURRENT_DATE, 'DD-MON-YYYY HH24:MI:SS') >= TODAY 
THEN 
    .... 

동시에 코드를 간소화 할 수도 있습니다.

DBMS_OUTPUT.PUT_LINE의 출력을 보려면 사용중인 클라이언트에 대해 SERVEROUTPUT ON을 설정해야합니다.


덧붙여 말하자면 오라클 내장과 동일한 이름을 공유하는 변수를 선언하는 것은 바람직하지 않습니다. 따라서 우리의 선언에 범위 접두어 (로컬의 경우 l_, 매개 변수의 경우 p_ 등)를 추가하는 것이 좋습니다. 우리는 많은 이점을 얻기 위해 헝가리 전체를 할 필요가 없습니다.

+0

'CURRENT_DATE'는 VARCHAR2 타입이고'24-APR-2013 16 : 15 : 17' btw와 같은 입력을받습니다. 이전에는 trunc 함수를 전혀 알지 못하기 때문에 코드를 간소화합니다. 감사. – noobie

+0

@a_horse_with_no_name - 오라클의 CURRENT_DATE를 자체 로컬 선언으로 대체 할 수 있습니다. 내가 말했듯이, 그것은 나쁜 습관이다. – APC

+0

@APC :'()'을 사용할 필요가없는 자신 만의 함수를 만들 수 있습니까?내 생각에'current_date'라는 이름의 함수를 만들면 그것을 사용할 수있는 유일한 방법은'current_date()' –