내 첫번째 생각 8)
를 배수구
"글쎄 CURRENT_DATE 유형 VARCHAR2입니다"그러나 나는 문제가 CURRENT_DATE
의 사용에 생각합니다. 그것이 오라클 함수라고 가정하면 다음 두 가지 문제가 발생할 수 있습니다.
- CURRENT_DATE는 DATE 데이터 유형이므로 시간 요소가 있습니다. 데이트 할 때까지 주조 할 필요가 없습니다.
- 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_
등)를 추가하는 것이 좋습니다. 우리는 많은 이점을 얻기 위해 헝가리 전체를 할 필요가 없습니다.
출처
2013-04-24 08:04:42
APC
왜'SYSDATE'를 먼저 문자 리터럴로 변환하여 나중에 다시 'DATE'로 변환합니까? 이는 전혀 쓸모가 없으며 다양한 NLS 환경에서 실패 할 수있는 'MON'형식으로 인해 발생합니다. 'today : = sysdate'는 훨씬 안전하고 정확합니다. 그리고'CURRENT_DATE'를 날짜로 변환하는 것은'to_date()'를 사용하여'DATE'로 변환하는 것은 쓸모가 없습니다. –
@a_horse_with_no_name 가능한 경우 형식 마스크의 일부로 'MON'을 피하는 것이 좋습니다.이 경우 OP가 MON을 일관되게 사용하기 때문에 (이 경우에는 앞뒤로 변환이 수행되지 않는 한 모든 NLS 설정에서 작동해야합니다. 다른 NLS 설정을 가진 다른 세션에서) - 또는 나는 틀린가? –
@a_horse_with_no_name 매개 변수 CURRENT_DATE에 대해 미안합니다. 오라클의 함수라는 것을 알지 못했습니다. 실제 매개 변수 이름은 CUR_DATE이므로 CURRENT_DATE로 다시 작성합니다. – noobie