如何组合一列中的日期和另一列中的时间

时间:2016-12-29 10:41:18

标签: sql oracle date

目前我正在尝试从两个日期列中选择一个日期时间列。我有以下情况:

  1. FROMDATE列包含没有时间的日期,例如08-01-2017 00:00:00
  2. FROMTIME列,其中包含没有日期的时间,例如01-01-1899 13:50:00
  3. 现在我想在一列中选择两者,例如SELECT (<what ever>) as FROMDATETIME ...

      

    预期成果:08-01-2017 13:50:00

    但我无法提取日期和时间部分并将它们作为datetime添加在一起。

    在一种 meta sql:select (date(FROMDATE) + time(FROMTIME)) as FROMDATETIME中使用。

    我对TO_CHARTO_DATE进行了很多尝试,但无法获得预期效果。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:4)

一种方法可能是将所有内容都转换为char,然后使用值的concatenato:

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

...但我想做的事(我无法做到)是在Alex Poole的回答

答案 2 :(得分:2)

你也可以使用日期算术:

fromtime + (fromdate - trunc(fromtime))

fromdate - trunc(fromtime)部分获取“时间”列中名义日期(trunc为零的时间)与“日期”列中的实际日期之间的整天天数。在您的示例中,这是2017-01-08和1899-01-01之间43106天。然后可以将该天数添加到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

答案 3 :(得分:1)

如果您的fromdatefromtime列为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;