Это не имеет значения для этого простого INSERTоператора, но в целом вы не хотите использовать такие переменные связывания. Преобразование типа в вашем первом операторе предотвращает его чувствительность к привязке, что ограничивает способность Oracle создавать хорошие планы. Оптимизатор может работать лучше, если вы используете values (:ts_val)вместо этого, при условии, что: ts_val отображается непосредственно на метку времени.
Джон Хеллер,
@JonHeller Можете ли вы показать конкретный пример того, как использование to_timestampможет вызвать плохой план выполнения для планируемого оператора SQL? Я могу показать пример, как этого не произошло бы. Вместо этого, я думаю, мы все хотим избежать неожиданного принуждения типа данных, которое исключает использование ожидаемой операции с источником строки (т. Е. Оптимальной).
Джефф Холт
@ jeff6times7 См. этот Gist для объяснения того, как неконвертированные переменные связывания могут превзойти преобразованные переменные связывания. Разница, вероятно, имеет значение только в том случае, если данные искажены. Благодаря встроенным типам привязки Oracle может лучше понимать данные и делать более точные оценки на основе значений.
Вид зависит от того, откуда берется значение, которое вы хотите вставить. Если вы хотите вставить текущее время, вы можете использовать, CURRENT_TIMESTAMPкак показано в других ответах (или SYSTIMESTAMP).
Если у вас есть время в виде строки и вы хотите преобразовать его в метку времени, используйте выражение вроде
Компоненты формата времени, я надеюсь, не требуют пояснений, за исключением того, что FF3 означает 3 цифры субсекундной точности. Вы можете увеличить точность до 6 знаков.
Если вы выполняете вставку из приложения, лучший ответ может зависеть от того, как значение даты / времени хранится на вашем языке. Например, вы можете сопоставить определенные объекты Java непосредственно в TIMESTAMPстолбце, но вам нужно понимать JDBCсопоставления типов.
Oracle 11. Поле, определенное как TIMESTAMP (6) не NULL. При использовании timestamp '2019-05-16 10:05:51:19:277401'я получаю эту ошибку: ORA-01882: регион часового пояса не найден
Ответы:
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? Я могу показать пример, как этого не произошло бы. Вместо этого, я думаю, мы все хотим избежать неожиданного принуждения типа данных, которое исключает использование ожидаемой операции с источником строки (т. Е. Оптимальной).INSERT INTO mytable (timestamp_field) VALUES (CURRENT_TIMESTAMP)
CURRENT_TIMESTAMP
иSYSTIMESTAMP
являются зарезервированными Oracle словами для этой цели. Они являются аналогом метки времениSYSDATE
.источник
INSERT INTO TABLE_NAME (TIMESTAMP_VALUE) VALUES (TO_TIMESTAMP('2014-07-02 06:14:00.742000000', 'YYYY-MM-DD HH24:MI:SS.FF'));
источник
Вид зависит от того, откуда берется значение, которое вы хотите вставить. Если вы хотите вставить текущее время, вы можете использовать,
CURRENT_TIMESTAMP
как показано в других ответах (илиSYSTIMESTAMP
).Если у вас есть время в виде строки и вы хотите преобразовать его в метку времени, используйте выражение вроде
Компоненты формата времени, я надеюсь, не требуют пояснений, за исключением того, что
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.
источник
CREATE TABLE Table1 ( id int identity(1, 1) NOT NULL, Somecolmn varchar (5), LastChanged [timestamp] NOT NULL)
это работает для mssql 2012
INSERT INTO Table1 VALUES('hello',DEFAULT)
источник