2016-12-29 2 views
4

В настоящее время я пытаюсь выбрать столбец datetime из двух столбцов даты. У меня есть следующая ситуация:Как совместить дату из одного столбца и время от другого

  1. FROMDATE столбец, содержащий даты без времени, например. 08-01-2017 00:00:00
  2. FROMTIME столбец, который содержит время без даты, например. 01-01-1899 13:50:00

Теперь я хочу выбрать как внутри одного столбца, например. SELECT (<what ever>) as FROMDATETIME ...

Ожидаемый результат: 08-01-2017 13:50:00

Но я не в состоянии извлечь дату и время части и добавить их вместе, как datetime.

Разговорный язык в виде meta sql: select (date(FROMDATE) + time(FROMTIME)) as FROMDATETIME.

Я пробовал много с TO_CHAR и TO_DATE, но не смог получить ожидаемый результат.

ответ

4

Здесь вы идете:

SELECT TO_DATE(TO_CHAR(t.fromdate,'dd-mm-yyyy') || 
       ' ' || 
       TO_CHAR(t.fromtime,'hh24:mi:ss'),'dd-mm-yyyy hh24:mi:ss') as full_date_col 
FROM YourTable t 
+0

Работает отлично, спасибо! – BendEg

4

Способ может быть литье все в уголь, а затем с помощью concatenatoin значений:

select to_date(to_char(FROMDATE, 'dd-mm-yyyy') || to_char(FROMTIME, 'hh24:mi:ss'), 'dd-mm-yyyyhh24:mi:ss') 
from test 

... но то, что я хотел сделать (и я не удалось) в ответ Alex Пула

1

Если fromdate и fromtime столбцы типа DATE, вы можете сделать следующее:

SELECT 
    TO_DATE(
     TO_CHAR(fromdate, 'DD-MM-YYYY') || ' ' || TO_CHAR(fromtime, 'HH24:MI:SS'), 
     'DD-MM-YYYY HH24:MI:SS' 
    ) AS fromdatetime 
FROM my_table; 

Если столбцы VARCHAR, вы должны сделать следующее

SELECT 
    TO_DATE(
     TO_CHAR(TO_DATE(fromdate, 'DD-MM-YYYY HH24:MI:SS'), 'DD-MM-YYYY') || ' ' || TO_CHAR(TO_DATE(fromtime, 'DD-MM-YYYY HH24:MI:SS'), 'HH24:MI:SS'), 
     'DD-MM-YYYY HH24:MI:SS' 
    ) AS fromdatetime 
FROM my_table; 
+0

Спасибо за ваше объяснение! – BendEg

+0

@BendEg Нет проблем;) –

2

Можно также использовать дату арифметику:

fromtime + (fromdate - trunc(fromtime)) 

fromdate - trunc(fromtime) часть получает количество полных дней между номинальной даты в столбце «время» (с trunc до нулевого времени в этом) и фактической датой в столбце «дата». В вашем примере это 43106 дней между 2017-01-08 и 1899-01-01. Это количество дней может быть добавлено к fromtime, который принимает дату в 1899 году до 43106 дней, чтобы соответствовать дате 2017 года.

Быстрый демо, с помощью CTE для генерации два примера значения, и показывает количество дней между датами, а также результат, который вы хотите:

with t (fromdate, fromtime) as (
    select date '2017-01-08', cast (timestamp '1899-01-01 13:50:00' as date) 
    from dual 
) 
select fromdate - trunc(fromtime) as days, 
    fromtime + (fromdate - trunc(fromtime)) as fromdatetime, 
    to_char(fromtime + (fromdate - trunc(fromtime)), 'DD-MM-YYYY HH24:MI:SS') as formatted 
from t; 

     DAYS FROMDATETIME  FORMATTED   
---------- ------------------- ------------------- 
    43106 2017-01-08 13:50:00 08-01-2017 13:50:00 
+0

Пожалуйста, помогите мне понять; это «секрет» в круглых скобках, а затем в неявной кастинге, когда он находит круглые скобки, правильно? – Aleksej

+0

@Aleksej - Я обновил немного больше объяснений.Бит в круглых скобках просто получает целые числа дней - не совсем неявное кастинг, это только то, что возвращает арифметика даты? Это число, добавленное к исходному времени, также является обычной арифметикой даты. (Скобки заключаются в том, чтобы сделать вычитание первым - иначе вы получите данные + дату, которая получит ORA-00975.) –

+1

Элегантные решения всегда кажутся настолько очевидными, когда вы их понимаете ... Могу ли я сделать пожертвование на авансцену? :) – Aleksej

Смежные вопросы