Как изменить формат даты запроса вставки Oracle на to_date в sqlc

Добрый день,

в рамках sqlcl я хотел бы выполнить запрос, который создает оператор вставки. Такие как:

SELECT /*insert*/* FROM TABLE;

но каждое значение даты возвращается как to_timestamp('date', 'format') и я хочу получить to_date('date', 'format') вместо.

Что мне нужно установить, чтобы это произошло?

Спасибо!!

Editted:

Например... У меня есть таблица с сохранением даты с двумя столбцами id и date. Если я выполню этот запрос

SELECT /*insert*/ id,date FROM datesaving ;

я получил

Insert into DATASAVING (ID, DATE) values (1,to_timestamp('2016-02-15 11:05:07','RRRR-MM-DD HH24:MI:SS'));

и я хочу получить это вместо

Insert into DATASAVING (ID, DATE) values (1,to_date('2016-02-15 11:05:07','RRRR-MM-DD HH24:MI:SS'));

Я знаю, что могу изменить de nls_format, но я не знаю, как это изменить.

2 ответа

Я нашел трюк, чтобы получить отсутствующую часть времени типа DATE в этой теме .

Просто введите следующую команду ПЕРЕД вводом операторов SELECT:

      ALTER SESSION SET NLS_DATE_FORMAT='DD-MON-RR HH.MI.SS AM';

Операторы INSERT будут учитывать этот формат:

      SQL> insert into TEST_INSERT (ID,DT,TS) values (1,to_timestamp('02-02-18 01.47.57','DD-MON-RR HH.MI.SSXFF AM'),to_timestamp('02-FEB-18 01.47.57.017643000 PM','DD-MON-RR HH.MI.SSXFF AM'));

Примечание 1

Я взял формат, который был сгенерирован в одном из ваших примеров (без , см. ниже).

В моем случае мне далиDD/MM/RR HH24:MI:SSформат. Это показывает, что сгенерированный формат для операторов INSERT зависит от параметров NLS (поддержка национального языка, т.е. локали) (например,NLS_TERRITORY), который должен быть установлен первым, чтобы гарантировать переносимость вашего кода.

ИспользоватьSELECT * FROM NLS_SESSION_PARAMETERS;чтобы получить содержимое ваших параметров и установить их в начале вашего скрипта.

Заметка 2

В соответствии с заданным форматом необходимо удалитьXFFчасть в конце, которая не имеет смысла с форматом DATE, потому что он не включает дробные секунды. ТакDD-MON-RR HH.MI.SSXFF AMстановитсяDD-MON-RR HH.MI.SS AM.

Это связано с тем, что метаданные, которые мы возвращаем в sqlcl, сообщают нам, что столбец DATE является меткой времени, поэтому код обрабатывает его как таковой. Тем не менее, это будет работать просто отлично.

SQL> create table test_insert(id number,dt date,ts timestamp);

Table TEST_INSERT created.

SQL> insert into test_insert values(1,sysdate,systimestamp);

1 row inserted.

SQL> set sqlformat insert
SQL> select * from test_insert;
REM INSERTING into TEST_INSERT
SET DEFINE OFF;
Insert into TEST_INSERT (ID,DT,TS) values (1,to_timestamp('02-FEB-18','DD-MON-RR HH.MI.SSXFF AM'),to_timestamp('02-FEB-18 01.47.57.017643000 PM','DD-MON-RR HH.MI.SSXFF AM'));

<<<copy pasted to run the output >>>

SQL> insert into TEST_INSERT (ID,DT,TS) values (1,to_timestamp('02-FEB-18','DD-MON-RR HH.MI.SSXFF AM'),to_timestamp('02-FEB-18 01.47.57.017643000 PM','DD-MON-RR HH.MI.SSXFF AM'));

1 row inserted.
Другие вопросы по тегам