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'
) ;