我正在尝试连接两个字段并将数据加载到日期字段中。
我的表格hier_dt
为DATE
数据类型,hier_tm
为CHAR
数据类型,数据如下:
hier_dt | hier_tm
16-JAN-17 | 16:54
16-JAN-17 | 16:54
16-JAN-17 | 16:54
16-JAN-17 | 16:54
17-JAN-17 | 17:54
我想将这两者连接成一个DATE
数据类型字段,以产生:
hier_dt_tm
----------------
2017/01/16 16:54
2017/01/16 16:54
2017/01/16 16:54
2017/01/16 16:54
2017/01/17 17:54
我有办法实现这个目标吗?
我目前的查询是:
select to_date(concat(to_char(NVL(hier_DT,'01-JAN-1900'), 'yyyy/mm/dd'),
concat(' ',NVL(hier_tm,'00:00'))), 'yyyy/mm/dd hh24:mi') as temp
from XXX1
答案 0 :(得分:3)
其他想法略有不同,就是将hier_dt
作为日期,并计算hier_tm
代表的一天中的一小部分。一种方法是将时间转换为日期 - 将其他所有内容默认为当前月份的第一个 - 并从中减去第一个,然后将结果添加到hier_dt
:
hier_dt + (to_date(hier_tm, 'HH24:MI') - trunc(sysdate, 'MM')
将显式格式化回字符串仅用于显示目的:
select to_char(
hier_dt + (to_date(hier_tm, 'HH24:MI') - trunc(sysdate, 'MM')),
'YYYY/MM/DD HH24:MI') as temp
from xxx1;
TEMP
----------------
2017/01/16 16:54
2017/01/16 16:54
2017/01/16 16:54
2017/01/16 16:54
2017/01/17 17:54
另一种方法是使用to_dsinterval()
函数将时间转换为interval数据类型,其中包括在虚拟日期和第二个值上添加以使函数识别的字符串:
hier_dt + to_dsinterval('0 ' || hier_tm || ':00')
这次没有显式转换为字符串,而是依赖于NLS设置:
alter session set nls_date_format = 'YYYY/MM/DD HH24:MI';
select hier_dt + to_dsinterval('0 ' || hier_tm || ':00') as temp
from xxx1;
TEMP
----------------
2017/01/16 16:54
2017/01/16 16:54
2017/01/16 16:54
2017/01/16 16:54
2017/01/17 17:54
对我而言,这种方法在理解代码试图做的事情方面是最明显的,尽管这种连接乍一看仍然不是很明显。
除了依赖您的NLS设置和将'01-JAN-1900'
隐式转换为日期之外,问题中的查询尝试似乎也有效;但它可以简化,我仍然更喜欢我的方法(显然!)。我错过了对null值的处理。因此,处理任一列中的空值的版本:
select coalesce(hier_dt, date '1900-01-01')
+ case when hier_tm is null then 0
else (to_date(hier_tm, 'HH24:MI') - trunc(sysdate, 'MM')) end as temp
from xxx1;
或
select coalesce(hier_dt, date '1900-01-01')
+ to_dsinterval('0 ' || coalesce(hier_tm, '00:00') || ':00') as temp
from xxx1;
答案 1 :(得分:1)
尝试:
SELECT
/* TO_DATE( */
TO_CHAR(hier_dt, 'YYYY/MM/DD') ||
' ' ||
hier_tm
/* ,'YYYY/MM/DD HH24:MI') */
AS HIER_dt_tm
FROM temp;
答案 2 :(得分:1)
使用此选项将其转换为DATE
。
SELECT
TO_DATE( TO_CHAR(hier_dt,'DD-MON-YYYY') || hier_tm , 'DD-MON-YYYY HH24:MI' ) HIER_dt
FROM Yourtable;
使用此按钮以所需格式显示。
SELECT
TO_CHAR ( TO_DATE( TO_CHAR(hier_dt,'DD-MON-YYYY') || hier_tm , 'DD-MON-YYYY HH24:MI' ),
'YYYY/MM/DD HH24:MI') hier_dt_tm
FROM Yourtable;