Извлечение полной метки времени (включая дату) из запроса на выборку;оракул - PullRequest
0 голосов
/ 13 июня 2011

Итак, я пытаюсь вставить несколько строк данных из одной таблицы в другую. Я сделал это; однако у меня возникла проблема с некоторыми из моих столбцов, в частности с датами. Когда запрос возвращает данные, он пропускает компонент времени даты, который обычно присутствует. Если это не имеет смысла, надеюсь, что последующие вещи помогут понять смысл.

Мой оригинальный запрос

SELECT 'insert into dante2 (subcar, batch_id, silicon, temperature, sulphur, manganese, phosphorus, start_pour, end_pour, sched_cast_date) values(',    SUBCAR,',',BBP.BATCH_ID   ,',',   SILICON                 ,',',TEMPERATURE                   ,',',   SULPHUR                 ,',',   MANGANESE                  ,',',   pHOSPHORUS                  ,',''',START_POUR      ,''',''',    END_POUR,''',''',SCHED_CAST_DATE              ,''');'
FROM  bof_chem_sample bcs, bof_batch_pour bbp, bof_celox_sample bofcs 
WHERE bcs.SAMPLE_CODE= to_char('D1')
and bofcs.sample_code=bcs.sample_code
and bofcs.batch_id=bcs.batch_id
and bcs.batch_id = bbp.batch_id
and bofcs.temperature>0
AND bbp.START_POUR>=to_date('01-JAN-11')
order by bbp.start_pour

Результаты запроса:

insert into dante2 (subcar, batch_id, silicon, temperature, sulphur, manganese, phosphorus, start_pour, end_pour, sched_cast_date) 
  values( 101,65277 ,0.6631,2525 ,0.0551,0.3366,0.043,'01-JAN-11','01-JAN-11','31-DEC-10'); 
insert into dante2 (subcar, batch_id, silicon, temperature, sulphur, manganese, phosphorus, start_pour, end_pour, sched_cast_date) 
  values( 123,65277 ,0.6631,2525 ,0.0551,0.3366,0.043,'01-JAN-11','01-JAN-11','31-DEC-10'); 
insert into dante2 (subcar, batch_id, silicon, temperature, sulphur, manganese, phosphorus, start_pour, end_pour, sched_cast_date) 
  values( 123,65278 ,0.7116,2470 ,0.0598,0.333,0.0423,'01-JAN-11','01-JAN-11','31-DEC-10'); 
insert into dante2 (subcar, batch_id, silicon, temperature, sulphur, manganese, phosphorus, start_pour, end_pour, sched_cast_date) 
  values( 116,65278 ,0.7116,2470 ,0.0598,0.333,0.0423,'01-JAN-11','01-JAN-11','31-DEC-10'); 

Тем не менее, я хочу, чтобы даты выглядели так: дд-мон-уу, чч24: ми. Кто-нибудь знает как это исправить?

Ответы [ 3 ]

7 голосов
/ 13 июня 2011

Два варианта:

1) Если у вас есть привилегия изменить сеанс, измените NLS_DATE_FORMAT перед выполнением оператора SELECT, как указано ниже:

ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-RR HH24:MI';

2) Если вы неt иметь привилегию сеанса ALTER, а затем применить преобразование для каждого поля даты, как указано ниже (в приведенном ниже stmnt это показано для START_POUR)

'TO_DATE(''' || TO_CHAR(START_POUR, 'DD-MON-RR HH24:MI') || ''', ''DD-MON-RR HH24:MI'')'
1 голос
/ 14 июня 2011

Интересно, если вы делаете эту проблему более сложной, чем она должна быть?

Существует простая форма INSERT, где вам нужно предоставить предложение VALUES, но вы также можетевставьте результаты оператора SELECT напрямую.

Таким образом, вы могли бы просто написать что-то вроде:

insert into dante2 (
  subcar, batch_id, silicon, temperature, sulphur, manganese, 
  phosphorus, start_pour, end_pour, sched_cast_date
)
SELECT 
  SUBCAR, BBP.BATCH_ID, SILICON, TEMPERATURE, SULPHUR, MANGANESE,
  pHOSPHORUS, START_POUR, END_POUR, SCHED_CAST_DATE
FROM 
  bof_chem_sample bcs, 
  bof_batch_pour bbp, 
  bof_celox_sample bofcs 
WHERE 
  bcs.SAMPLE_CODE= to_char('D1') and 
  bofcs.sample_code=bcs.sample_code and 
  bofcs.batch_id=bcs.batch_id and 
  bcs.batch_id = bbp.batch_id and 
  bofcs.temperature>0 AND 
  bbp.START_POUR>=to_date('01-JAN-2011', 'dd-mon-yyyy');

Это будет иметь преимущество в том, что будет намного быстрее, чем ваше существующее решение, поскольку каждое из выполняемых вами операторов INSERT потребует времени дляанализировать и выполнять, но для этого требуется только один оператор.Он также выполняется за один шаг, поскольку вам не нужно создавать операторы INSERT, и все типы (например, даты) обрабатываются корректно.

Однако, если вам все еще нужно создавать операторы вставки, вам нужно обработатьтипы данных.Строки и числа в порядке, потому что Oracle знает, что с ними делать.даты более важны, потому что если вы не используете функции to_char и to_date, то вы полагаетесь на неявное преобразование, которое вызовет у вас загадочные проблемы, подобные тем, которые вы испытываете.Вероятно, стоит прочитать документацию Oracle по неявному преобразованию , чтобы выяснить, почему это плохо.

Как уже упоминалось в Cybernate, вам необходимо сначала явно преобразовать столбцы даты / времени встрока символов (с использованием to_char), которую затем можно преобразовать обратно в дату с помощью to_date.

0 голосов
/ 13 июня 2011

Во-первых, есть ли у вас примерные данные полей даты?

Если информация о отметке времени не сохранена, ее будет не очень хорошо назвать.Я бы посмотрел в нем формат источника, из которого вы извлекаете.

Оттуда вы можете установить формат вывода оператора SELECT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...