timestamp필드 가있는 Oracle DB가 있습니다. timestamp이 필드 에 삽입 할 올바른 SQL 코드는 무엇입니까 ?
답변:
insert
into tablename (timestamp_value)
values (TO_TIMESTAMP(:ts_val, 'YYYY-MM-DD HH24:MI:SS'));
현재 타임 스탬프를 삽입하려면 다음을 수행하십시오.
insert
into tablename (timestamp_value)
values (CURRENT_TIMESTAMP);
TO_DATE대신 왜 TO_TIMESTAMP?
INSERT문에서는 중요하지 않지만 일반적으로 이와 같은 바인드 변수를 사용하고 싶지 않습니다. 첫 번째 명령문의 유형 변환은 바인드에 민감하지 않게하여 Oracle이 좋은 계획을 작성하는 능력을 제한합니다. values (:ts_val)대신 사용하면 최적화 프로그램이 더 잘 작동 할 수 있습니다 . : ts_val이 타임 스탬프에 직접 매핑된다고 가정합니다.
to_timestamp하면 계획 가능한 SQL 문에 대해 잘못된 실행 계획이 발생 하는 구체적인 예를 보여줄 수 있습니까 ? 나는 그것이 어떻게되지 않을지에 대한 예를 보여줄 수 있습니다. 대신, 우리 모두가 피하고 싶은 것은 예상되는 행 소스 작업 (즉, 최적의 작업)을 사용하지 못하게하는 예기치 않은 데이터 유형 강제 변환입니다.
종류는 삽입하려는 값의 출처에 따라 다릅니다. 현재 시간을 삽입하려면 CURRENT_TIMESTAMP다른 답변과 같이 사용할 수 있습니다.SYSTIMESTAMP ) .
시간이 문자열로 있고이를 타임 스탬프로 변환하려면 다음과 같은 표현식을 사용하십시오.
to_timestamp(:timestamp_as_string,'MM/DD/YYYY HH24:MI:SS.FF3')
시간 형식 구성 요소는 설명이 필요하지 않습니다. FF3 3 자리 이하의 정밀도 의미 것을 합니다. 6 자리의 정밀도까지 올릴 수 있습니다.
응용 프로그램에서 삽입하는 경우 가장 좋은 답변은 날짜 / 시간 값이 사용자 언어로 저장되는 방식에 따라 달라질 수 있습니다. 예를 들어 특정 Java 객체를 TIMESTAMP열에 직접 매핑 할 수 있지만 JDBC유형 매핑 을 이해해야 합니다.
ANSI 타임 스탬프 리터럴을 선호합니다.
insert into the_table
(the_timestamp_column)
values
(timestamp '2017-10-12 21:22:23');
자세한 내용은 https://docs.oracle.com/database/121/SQLRF/sql_elements003.htm#SQLRF51062
timestamp '2019-05-16 10:05:51:19:277401'나는이 오류가 있습니다 : ORA-01882 : 시간대 지역을 찾을 수 없습니다
먼저 필드를 Nullable로 설정해야합니다. 그런 다음 값을 넣는 대신이 코드를 넣어야합니다 CURRENT_TIMESTAMP.
내 자신의 미래 참조 :
cx_Oracle 사용 cursor.setinputsize (...) :
mycursor = connection.cursor();
mycursor.setinputsize( mytimestamp=cx_Oracle.TIMESTAMP );
params = { 'mytimestamp': timestampVar };
cusrsor.execute("INSERT INTO mytable (timestamp_field9 VALUES(:mytimestamp)", params);
db에서 변환이 필요하지 않습니다. Oracle 문서 참조