如何结合一列的日期和另一列的时间
Posted
技术标签:
【中文标题】如何结合一列的日期和另一列的时间【英文标题】:How to combine date from one column and time from another 【发布时间】:2016-12-29 10:41:17 【问题描述】:目前我正在尝试从两个日期列中选择一个日期时间列。我有以下情况:
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
.
我对@987654328@ 和TO_DATE
进行了很多尝试,但未能获得预期的结果。
【问题讨论】:
【参考方案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
【讨论】:
【参考方案2】:一种方法可以将所有内容转换为 char,然后使用值的连接:
select to_date(to_char(FROMDATE, 'dd-mm-yyyy') || to_char(FROMTIME, 'hh24:mi:ss'), 'dd-mm-yyyyhh24:mi:ss')
from test
...但我想做(但我不能)在 Alex Poole 的回答中
【讨论】:
【参考方案3】:你也可以使用日期算术:
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
【讨论】:
请帮我理解;是括号中的“秘密”,然后在他找到括号时进行的隐式转换,对吗? @Aleksej - 我已经更新了更多解释。括号中的位只是获得整数天数 - 不是真正的隐式转换,这就是日期算术返回的内容?添加到原始时间的那个数字也只是普通的日期算术。 (括号是为了让减法首先发生 - 否则你会得到数据+日期,这会得到 ORA-00975。) 当您理解优雅的解决方案时,它们看起来总是那么明显……我可以投赞成票吗? :)【参考方案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;
【讨论】:
感谢您的解释! @BendEg 没问题 ;)以上是关于如何结合一列的日期和另一列的时间的主要内容,如果未能解决你的问题,请参考以下文章