目前我正在尝试从两个日期列中选择一个日期时间列。我有以下情况:
FROMDATE
列包含没有时间的日期,例如08-01-2017 00:00:00
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
进行了很多尝试,但无法获得预期效果。
答案 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)
如果您的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;