2013-12-23 2 views
2

Oracle 11g을 사용하고 있으며이 날짜를 테이블에 삽입하는 방법을 알아 내려고합니다. 날짜는 ISO-8601 인 것처럼 보이지만 7 개의 0은 나를 혼란스럽게합니다.oracle 데이터베이스에 iso-8601 유형 날짜를 삽입하는 방법

Insert into myTestTable (myDate) values ('2013-01-22T00:00:00.0000000-05:00'); 

행운을 남기고 날짜를 지정하려고했습니다. ORA-01861 리터럴이 형식 문자열과 일치하지 않습니다.

답변

2

여기가 답입니다.

insert into myTestTable (myDate) values 
(to_timestamp_tz('2013-01-22T00:00:00.0000000-05:00', 
'YYYY-MM-DD"t"HH24:MI:SS.FF7TZR')); 
5

먼저 삽입하려는 값을 보유하려면 열이 TIMESTAMP WITH TIME ZONE 유형이어야합니다. Oracle DATE은 초 단위로 정확하며 시간대가 없습니다.

7 개의 0은 분 초입니다. TIMESTAMP WITH TIME ZONE의 기본 정밀도는 소수점 이하 7 자리입니다. 초 단위로 세 자리를 지정하려면 열을 TIMESTAMP(3) WITH LOCAL TIME ZONE으로 정의하십시오.

서버의 현재 시간 소인 SYSTIMESTAMP에 의해 반환되는 실제 소수 자릿수는 운영 체제에 따라 다릅니다. 내 로컬 Windows 7 Oracle은 소수점 3 자리를 반환하지만 고객 중 한 곳의 Solaris OS는 소수점 6 자리를 반환합니다. 당신이 뭔가를 할 경우, 값을 삽입에 관해서는

...

insert into myTestTable (myTS) values ('2013-01-22T00:00:00.0000000-05:00'); 

... 오라클은 현재 NLS_TIMESTAMP_TZ_FORMAT 설정을 사용하여 타임 스탬프를 변환하려고합니다. 다음과 같이 설정을 쿼리 할 수 ​​있습니다.

SELECT * 
FROM NLS_Session_Parameters 
WHERE Parameter = 'NLS_TIMESTAMP_TZ_FORMAT'; 

PARAMETER    VALUE 
----------------------- ---------------------------- 
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR 

내가 얻은 결과는 "공장 기본값"입니다. 너의 것은 아마 동일하고, 당신이 준 포맷과 일치하지 않는 것을 볼 수있다. 따라서 변환은 실패한다.

다른 대답이 올바르게 기록되면 TO_TIMESTAMP_TZ 함수와 형식 문자열을 사용하여 문자열을 타임 스탬프로 변환 할 수 있습니다.

insert into myTestTable (myTS) 
    values (TIMESTAMP '2013-01-22T00:00:00.0000000-05:00'); 

오라클 문서 타임 스탬프 리터럴 here : 당신은 또한 리터럴 ANSI 타임 스탬프를 사용할 수 있습니다. 링크는 모든 유형의 리터럴을 포함하므로 타임 스탬프 리터럴에 도달하기 위해 화면의 약 2/3을 스크롤 (또는 찾기)해야합니다.

관련 문제