将日期和字符'时间'字段转换为单个日期

时间:2017-12-07 17:50:58

标签: sql oracle

我正在尝试连接两个字段并将数据加载到日期字段中。

我的表格hier_dtDATE数据类型,hier_tmCHAR数据类型,数据如下:

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

3 个答案:

答案 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;

Boost.Circular Buffer

答案 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; 

DEMO