Как изменить формат даты запроса вставки 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.