为啥 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
没有小数秒——使用systimestamp
或current_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) 转换为日期时间