为啥 oracle 像日期“dd/mm/yyyy”一样插入“hh24:mi:ss”

Posted

技术标签:

【中文标题】为啥 oracle 像日期“dd/mm/yyyy”一样插入“hh24:mi:ss”【英文标题】:why oracle is inserting "hh24:mi:ss" like a date "dd/mm/yyy"为什么 oracle 像日期“dd/mm/yyyy”一样插入“hh24:mi:ss” 【发布时间】:2012-09-27 20:17:56 【问题描述】:

我需要运行这条sql语句:

INSERT INTO JSP_CONTROL (estado,hora_inicio,fecha,tipo) VALUES
('ACTUALIZANDO',to_char(sysdate, 'HH24:mi:SS'),sysdate,'uno');

这是桌子:

CREATE TABLE "GCUENTAS"."JSP_CONTROL"
(
"ESTADO" VARCHAR2(20 BYTE),
"HORA_INICIO" TIMESTAMP (6),
"HORA_TERMINO" TIMESTAMP (6),
"FECHA" DATE,
"TIPO" VARCHAR2(20 BYTE)

问题出在这里:to_char(sysdate, 'HH24:mi:SS'),它应该插入“16:01:35”之类的内容,但插入“16/01/35”(在 DD/MM/ YY 格式)。

做一些类似的测试

从 DUAL 中选择 to_char(sysdate, 'HH24:mi:SS')

成功了

这是消息错误:

Error que empieza en la línea 1 del comando:
INSERT INTO JSP_CONTROL (estado,hora_inicio,fecha,tipo) VALUES
  ('ACTUALIZANDO',to_char(sysdate, 'HH24:mi:SS'),sysdate,'uno')
Informe de error:
Error SQL: ORA-01843: mes no válido
01843. 00000 -  "not a valid month"
*Cause:    
*Action:
Error que empieza en la línea 1 del comando:
INSERT INTO JSP_CONTROL (estado,hora_inicio,fecha,tipo) VALUES
  ('ACTUALIZANDO',to_char(sysdate, 'HH24:mi:SS'),sysdate,'uno')
Informe de error:
Error SQL: ORA-01843: mes no válido
01843. 00000 -  "not a valid month"
*Cause:    
*Action:

【问题讨论】:

timestamp(6) 包含日期和时间,秒精度为 6 位。使用sysdate 填充hora_termino 没有意义,因为sysdate 没有小数秒——使用systimestampcurrent_timestamp 会更合乎逻辑。将字符串分配给hora_inicio 是没有意义的,尝试仅分配一个时间组件就更没有意义了。由于必须有日期组件,因此将使用今天的日期,因此,如果可行,您只需返回分配 sysdate 【参考方案1】:

hora_inicio 是一个时间戳列,但由于to_char() 调用,您在插入语句中将一个字符值传递给它。

在处理您提供的字符值时,Oracle 会尝试将其转换为时间戳(因为目标列时间戳)。但是像23:56:12 这样的时间绝对不是一个有效的日期。

如果您尝试在该列中插入时间部分,那将不起作用。时间戳总是包含一个日期。 Oracle 中没有数据类型只能保存时间。

【讨论】:

好吧,如果打算存储持续时间而不是时间,您可以使用INTERVAL DAY TO SECOND "Oracle 中没有数据类型只能保存时间。"为此,我将像 varchar 一样节省时间。

以上是关于为啥 oracle 像日期“dd/mm/yyyy”一样插入“hh24:mi:ss”的主要内容,如果未能解决你的问题,请参考以下文章

如何屏蔽 EditText 以显示 dd/mm/yyyy 日期格式

SQL Server 格式日期 DD.MM.YYYY HH:MM:SS

Android - 将日期格式更改为 - dd.mm.yyyy HH:mm [重复]

SQL - 将 varchar (dd/mm/yyyy hh.mm AM/PM) 转换为日期时间

将日期时间数据的数据框列转换为 DD/MM/YYYY 字符串数据

将日期 javascript 从 yyyy/mm/dd 反转为 dd/mm/yyyy