У меня есть база данных Oracle с timestamp
полем в ней. Какой правильный код SQL нужно вставить timestamp
в это поле?
У меня есть база данных Oracle с timestamp
полем в ней. Какой правильный код SQL нужно вставить timestamp
в это поле?
Ответы:
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: регион часового пояса не найден
Вставка даты в sql
insert
into tablename (timestamp_value)
values ('dd-mm-yyyy hh-mm-ss AM');
Если предположить, что мы хотим вставить системную дату
insert
into tablename (timestamp_value)
values (sysdate);
В первую очередь вам нужно сделать поле 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);
Преобразование в БД не требуется. См. Документацию Oracle
Можно просто использовать
INSERT INTO MY_TABLE(MY_TIMESTAMP_FIELD)
VALUES (TIMESTAMP '2019-02-15 13:22:11.871+02:00');
Таким образом, вам не придется беспокоиться о строке формата даты, просто используйте формат метки времени по умолчанию.
Работает с Oracle 11, понятия не имею, работает ли он с более ранними версиями Oracle.