У мене є база даних 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);
Не потрібно перетворення в db. Див. Документацію Oracle
Можна просто використовувати
INSERT INTO MY_TABLE(MY_TIMESTAMP_FIELD)
VALUES (TIMESTAMP '2019-02-15 13:22:11.871+02:00');
Таким чином вам не доведеться турбуватися про рядок формату дати, просто використовуйте формат мітки часу за замовчуванням.
Працює з Oracle 11, не маю уявлення, чи це стосується попередніх версій Oracle.