2013-11-04 4 views
1

datetime 필드를 최신으로 변환하는 데 문제가 있습니다. 다음은 쿼리입니다 :Oracle TIMEDATE to DATE

SELECT TO_DATE(PROJ.RECEIVEDDATE, 'MM/dd/yyyy') 
FROM PROJ 

는하지만 그것을 실행할 때 나는 "ORA-01843 : 유효한 월"다음과 같은 오류가 난 날짜

에 먼저 숯불로 변환하려고 그래서

SELECT TO_DATE(TO_CHAR(PROJ.RECEIVEDDATE, 'MM/dd/yyyy'), 'MM/dd/yyyy') 
FROM PROJ 

그러나 잘못된 출력을 얻을, "2005년 1월 18일 00 : 00 : 00.0"

+0

단순히 to_char 함수를 실행하면 어떻게 될까요? –

+0

to_char을 할 때 서식이 정확하지만 날짜가 아니므로 번호순으로 만 정렬됩니다. –

+0

Eclipse 내부에있는 경우 JDBC를 사용 중입니다. 그것은 잠시이지만'RECEIVEDDATE FROM PROJ'가 java.sql.Date 객체를 반환하지 않을 것인가? –

답변

5

난 그 시간 구성 요소가 된대로 DATE 데이터 유형에 대한 조금 혼란 것 같아요 -이 외설 분리 기호 오라클에서는 DATETIME 유형을 먹었습니다. RECEIVEDDATE 필드가 이미 DATE 인 경우에는 불필요한 것으로 변환되지만 중간에있는 문자열로의 암시 적 변환도 수행하고 있습니다.

TO_DATE(PROJ.RECEIVEDDATE, 'MM/dd/yyyy') 

정말
TO_DATE(TO_CHAR(PROJ.RECEIVEDDATE, <NLS_DATE_FORMAT>), 'MM/dd/yyyy') 

을하고있다 ... 그리고 NLS 형식 DD/MM/YYYY을 할 수있는 ORA-08143 오류가 당신을 제안합니다. 날짜의 일 부분이 12보다 큰 경우 12보다 큰 숫자가없는 월이 없으므로 이러한 종류의 오류가 발생할 수 있습니다. 2005-01-18에서 작업 한 것처럼 보이므로 18 개월을 1 년으로 해석하므로 오류는 합리적입니다.

질문의 첫 번째 부분을 어떻게 표현했는지에 따라 두 번째 쿼리에서 수행하는 필드의 시간 부분을 제거하려고합니다. 이번에는 명시적인 날짜 형식 모델을 사용하기 때문에 작동합니다. . 그러나이 변환을 수행하는 것은 당신이 그렇게 할 수 TRUNC function을 사용할 수 있습니다, 정말 필요하지 않습니다 :

SELECT TRUNC(PROJ.RECEIVEDDATE) 
FROM PROJ 

마지막 부분은 비록 조금 혼란 - 그 '잘못'아니다, 당신이 클라이언트가있어 방법 DATE 값의 형식을 선택합니다. 당신은 특정 형식으로 볼 단지 TO_CHAR을 사용하고 당신도 TRUNC 필요가 없습니다하려는 경우 :

SELECT TO_CHAR(PROJ.RECEIVEDDATE, 'mm/dd/yyyy') 
FROM PROJ 

을 ...하지만 당신이 무슨 일을하는지 따라 달라집니다 - 당신이 사용하는 경우 그것은 순전히 디스플레이를위한 것이기 때문에 더 큰 쿼리의 다른 곳에서 사용될 경우 DATE으로 남겨 두십시오.

+0

RECEIVEDDATE에 대한 데이터는 2005-01-18 22 : 35 : 31.0으로 반환됩니다. MM/dd/yyyy로 입력해야하지만 시도한 모든 것에서는 아무 것도 작동하지 않습니다. –

+1

@ user2953762 - 클라이언트가 클라이언트 설정을 변경하려고 시도 할 수도 있지만 'TO_CHAR'로 원하는 형식을 지정하는 것이 좋습니다. 그러나 당신은 당신이 그것으로 주문하기를 원한다는 것을 암시했습니다, 그 경우에 당신은 그것을 'DATE'로 남겨 두어야합니다. 'ORDER BY' 절을 빌려서. –