Як вставити мітку часу в Oracle?


91

У мене є база даних Oracle із timestampполем у ній. Який правильний код SQL вставити timestampу це поле?


9
"Я ніде не можу знайти цю інформацію." Документація Oracle є повною та доступною в Інтернеті. Знайдіть його тут: download.oracle.com/docs/cd/B19306_01/server.102/b14200/toc.htm
APC

Відповіді:


135
insert
into tablename (timestamp_value)
values (TO_TIMESTAMP(:ts_val, 'YYYY-MM-DD HH24:MI:SS'));

якщо ви хочете вставити поточну позначку часу, тоді:

insert
into tablename (timestamp_value)
values (CURRENT_TIMESTAMP);

1
Чому TO_DATEзамість TO_TIMESTAMP?
Дейв Коста

Це не має значення для цього простого INSERTтвердження, але загалом ви не хочете використовувати такі змінні прив'язки. Перетворення типу у вашому першому твердженні запобігає його чутливості до прив’язки, що обмежує можливість Oracle створювати хороші плани. Оптимізатор може працювати краще, якщо ви використовуєте values (:ts_val)замість нього, припускаючи: ts_val відображає безпосередньо мітку часу.
Джон Хеллер

@JonHeller Чи можете ви показати конкретний приклад того, як використання to_timestampможе спричинити поганий план виконання для плануваного оператора SQL? Я можу показати приклад, як цього не було б. Натомість те, що, на мою думку, ми всі хочемо уникнути, - це несподіваний примус типу даних, який виключає використання очікуваної операції з джерелом рядків (тобто оптимальної).
Джефф Холт,

@ jeff6times7 Дивіться цей Звіт для пояснення того, як неперетворені змінні прив'язки можуть перевершити перетворені змінні прив'язки. Різниця, ймовірно, має значення лише в тому випадку, коли дані перекошені. З типовими типами прив’язки Oracle може краще розуміти дані та робити кращі оцінки на основі значень.
Джон Хеллер,

24
INSERT
INTO    mytable (timestamp_field)
VALUES  (CURRENT_TIMESTAMP)

CURRENT_TIMESTAMPі SYSTIMESTAMPє для цього зарезервованими словами Oracle. Вони є аналогом позначки часу SYSDATE.


19
INSERT INTO TABLE_NAME (TIMESTAMP_VALUE) VALUES (TO_TIMESTAMP('2014-07-02 06:14:00.742000000', 'YYYY-MM-DD HH24:MI:SS.FF'));

9

Вид залежить від того, звідки надходить значення, яке потрібно вставити. Якщо ви хочете вставити поточний час, ви можете використовувати, CURRENT_TIMESTAMPяк показано в інших відповідях (абоSYSTIMESTAMP ).

Якщо у вас є час як рядок і ви хочете перетворити його на позначку часу, використовуйте вираз типу

to_timestamp(:timestamp_as_string,'MM/DD/YYYY HH24:MI:SS.FF3')

Компоненти формату часу, я сподіваюся, самі собою пояснюються, за винятком цього FF3 означає 3 цифри точності в секунду. Ви можете досягати 6 цифр точності.

Якщо ви вставляєте програму, найкраща відповідь може залежати від того, як значення дати / часу зберігається вашою мовою. Наприклад, ви можете зіставити певні об'єкти Java безпосередньо зі TIMESTAMPстовпцем, але вам потрібно зрозуміти JDBCзіставлення типів.


4

Я віддаю перевагу літералам мітки часу 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


Oracle 11. Поле, визначене як TIMESTAMP (6), а не NULL. Використовуючи timestamp '2019-05-16 10:05:51:19:277401'У мене така помилка: ORA-01882: регіон часового поясу не знайдено
Олексій 75,

1

Вставка дати в sql

insert
into tablename (timestamp_value)
values ('dd-mm-yyyy hh-mm-ss AM');

Якщо припустимо, ми хотіли вставити системну дату

insert
into tablename (timestamp_value)
values (sysdate);

0

Перш за все вам потрібно зробити поле Nullable, а потім після цього настільки простим - замість того, щоб вводити значення, поставте цей код CURRENT_TIMESTAMP.


0

Для мого власного майбутнього:

З 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


0

Можна просто використовувати

INSERT INTO MY_TABLE(MY_TIMESTAMP_FIELD)
VALUES (TIMESTAMP '2019-02-15 13:22:11.871+02:00');

Таким чином вам не доведеться турбуватися про рядок формату дати, просто використовуйте формат мітки часу за замовчуванням.

Працює з Oracle 11, не маю уявлення, чи це стосується попередніх версій Oracle.


-6
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)  
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.