Arhn - архитектура программирования

Как совместить дату из одного столбца и время из другого

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

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

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

Ожидаемый результат: 01.08.2017 13:50:00

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

Произносится в виде мета sql: select (date(FROMDATE) + time(FROMTIME)) as FROMDATETIME.

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

29.12.2016

Ответы:


1

Ну вот:

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
29.12.2016

2

Способ может заключаться в том, чтобы привести все к char, а затем использовать конкатенацию значений:

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

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

29.12.2016

3

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

fromtime + (fromdate - trunc(fromtime))

Часть fromdate - trunc(fromtime) получает количество полных дней между номинальной датой в столбце «время» (с trunc для обнуления времени в этом) и фактической датой в столбце «дата». В вашем примере это 43106 дней между 08.01.2017 и 01.01.1899. Затем это количество дней можно добавить к 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
29.12.2016
  • Пожалуйста, помогите мне понять; секрет в круглых скобках, а затем в неявном приведении, когда он находит круглые скобки, верно? 29.12.2016
  • @Aleksej - я добавил немного дополнительных объяснений. Бит в скобках просто получает целое количество дней - на самом деле это не неявное приведение, это просто то, какую дату возвращает арифметика? Это число, добавленное к исходному времени, также является обычной арифметикой даты. (Скобки нужны для того, чтобы сначала произошло вычитание, иначе вы получите данные+дату, что приведет к ORA-00975.) 29.12.2016
  • Элегантные решения всегда кажутся такими очевидными, когда вы их понимаете... Могу я сделать пожертвование? :) 29.12.2016

  • 4

    Если ваши столбцы 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;
    
    29.12.2016
  • Спасибо за ваше объяснение! 29.12.2016
  • @BendEg Нет проблем;) 29.12.2016
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..