Как вставить метку времени в Oracle?

93

У меня есть база данных Oracle с timestampполем в ней. Какой правильный код SQL нужно вставить timestampв это поле?

Майк Рифгин
источник
9
«Я нигде не могу найти эту информацию». Документация Oracle обширна и доступна в Интернете. Его можно найти здесь: download.oracle.com/docs/cd/B19306_01/server.102/b14200/toc.htm
APC,

Ответы:

141
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 См. этот Gist для объяснения того, как неконвертированные переменные связывания могут превзойти преобразованные переменные связывания. Разница, вероятно, имеет значение только в том случае, если данные искажены. Благодаря встроенным типам привязки Oracle может лучше понимать данные и делать более точные оценки на основе значений.
Джон Хеллер
24
INSERT
INTO    mytable (timestamp_field)
VALUES  (CURRENT_TIMESTAMP)

CURRENT_TIMESTAMPи SYSTIMESTAMPявляются зарезервированными Oracle словами для этой цели. Они являются аналогом метки времени SYSDATE.

Quassnoi
источник
20
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

a_horse_with_no_name
источник
Oracle 11. Поле, определенное как TIMESTAMP (6) не NULL. При использовании timestamp '2019-05-16 10:05:51:19:277401'я получаю эту ошибку: ORA-01882: регион часового пояса не найден
Alex 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);

Преобразование в БД не требуется. См. Документацию 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)  
VGuest
источник