Sql 将列与日期和时间合并

Sql 将列与日期和时间合并,sql,oracle,Sql,Oracle,我有一张桌子: CLIENT NUMBER (15,0), REGION NUMBER (5,0), DATA DATE, TIME NVARCHAR2(10) 我想合并列DATE(dd.mm.yy)和TIME(hh24.mi) 尝试使用以下方法: 从表中选择日期(数据|时间,'dd.mm.yy hh24:mi') 并得到以下错误:ORA-01843:不是有效月份 如何解决 表: CREATE TABLE TEST INSERT INTO TEST VALUES (12345678, 345

我有一张桌子:

CLIENT NUMBER (15,0),
REGION NUMBER (5,0),
DATA DATE,
TIME NVARCHAR2(10)
我想合并列DATE(dd.mm.yy)和TIME(hh24.mi)

尝试使用以下方法:
从表中选择日期(数据|时间,'dd.mm.yy hh24:mi')

并得到以下错误:ORA-01843:不是有效月份

如何解决

表:

CREATE TABLE TEST

INSERT INTO TEST
VALUES (12345678, 34567, TO_DATE ('18.08.20', 'dd.mm.yy'), '13:16' );

INSERT INTO TEST
VALUES (12345678, 34567, TO_DATE ('18.08.20','dd.mm.yy'), '14:01' );

INSERT INTO TEST
VALUES (12345678, 45678, TO_DATE ('18.08.20','dd.mm.yy'), '14:16' );

INSERT INTO TEST
VALUES (12345678, 34567, TO_DATE ('19.08.20', 'dd.mm.yy'),'09:01' );

INSERT INTO TEST
VALUES (34567896, 23456, TO_DATE ('19.08.20','dd.mm.yy'), '09:15' );

INSERT INTO TEST
VALUES (12345678, 34567, TO_DATE ('19.08.20', 'dd.mm.yy'),'09:28' );


算术可能是最简单的解决方案:

select data + (substr(tm, 1, 2) + substr(tm, -2) / 60) / 24

您应该使用to_时间戳,而不是to_日期:

 SELECT TO_timestamp(data || time, 'dd.mm.yy hh24:mi') from test;
有时,如果您的NLS时间格式设置不同,您将无法看到所需的特定日期格式,在运行上述语句之前,我建议运行此语句

 alter session set NLS_TIMESTAMP_FORMAT = 'dd.mm.yy HH24:MI';

以下查询应提供包含数据和时间(列)的日期值:

您可以向表中添加一个虚拟列,并使用to_DATE()调用(如上所述)生成日期值:

alter table test
add dt DATE generated always as (
  to_date (
    to_char( DATA, 'DD.MM.RR' ) || ' ' || time
  , 'DD.MM.YY HH24:MI'
  )
) virtual ;

-- Table altered.

-- check
select 
  dt  dt_not_formatted
, to_char( dt, 'YYYY-MM-DD HH24:MI:SS' ) dt_formatted
, data old_date
, time old_time
from test ;

-- result
   DT_NOT_FORMATTED           DT_FORMATTED     OLD_DATE    OLD_TIME 
___________________ ______________________ ____________ ___________ 
18-AUG-20           2020-08-18 13:16:00    18-AUG-20    13:16       
18-AUG-20           2020-08-18 14:01:00    18-AUG-20    14:01       
18-AUG-20           2020-08-18 14:16:00    18-AUG-20    14:16       
19-AUG-20           2020-08-19 09:01:00    19-AUG-20    09:01       
19-AUG-20           2020-08-19 09:15:00    19-AUG-20    09:15       
19-AUG-20           2020-08-19 09:28:00    19-AUG-20    09:28 
或者,您可以将日期列添加到原始表中,并使用数据和时间值进行更新:

alter table test add dtnew date ;

update test
set dtnew = to_date(
  to_char( DATA, 'DD.MM.RR' ) || ' ' || time
, 'DD.MM.YY HH24:MI'
) ;
D小提琴:


您能提供表2或表3行样本中的数据吗?您听说过Y2K问题吗?为什么?你的数据模型有缺陷。在oracle中,日期数据类型包括时间,精确到秒。在oracle中,时间戳数据类型包括时间,精确到纳秒。把日期和时间分开是没有意义的。保留字符类型或字符类型都会导致问题。同样的错误。。。我更新了问题中的表数据,您使用的是哪一版本的oracle?我运行的是oracle 12c,我的答案对于您提供的示例数据和脚本非常有效。请重新检查您的帖子添加更多详细信息。我测试了| timestamp(data | | time,'dd.mm.yy hh24:mi'),除非您使用的是不同的Oracle版本,否则它工作正常。
alter table test add dtnew date ;

update test
set dtnew = to_date(
  to_char( DATA, 'DD.MM.RR' ) || ' ' || time
, 'DD.MM.YY HH24:MI'
) ;