Oracle/SQL:将日期和时间连接成单个日期值时的数字格式模型无效

Posted

技术标签:

【中文标题】Oracle/SQL:将日期和时间连接成单个日期值时的数字格式模型无效【英文标题】:Oracle/SQL: invalid number format model when concatenating a date and a time into a single date value 【发布时间】:2011-12-03 18:26:20 【问题描述】:

我正在尝试在 Oracle 中创建一个触发器,该触发器比较两个日期,然后如果两个日期的差异低于某个值,则删除记录。我有一个格式为“DD-MON-YYYY HH24MI”的完整日期值,然后对于第二个日期值,我想将“DD-MON-YYYY”值与“HH24MI”值连接起来。

我遇到的问题是,当我尝试使用 to_char 将日期和时间值连接在一起,然后在该返回值上使用 to_date 时,它​​给了我一个 ORA-01481 无效数字格式错误。触发器本身的相关行如下。如果有人可以帮助我解决这个问题,将不胜感激!

CREATE OR REPLACE TRIGGER dateTrig
...
DECLARE
    day date;
    ftime date;
    CURSOR c_table1 IS SELECT ...;
BEGIN
FOR entry IN c_table1 LOOP
    day := to_date(entry.fdate);
    ftime := to_date(to_char(day, 'DD-MON-YYYY') || ' ' || to_char(entry.dtime, 'HH24MI'), 'DD-MON-YYYY HH24MI'); -- this is the line that is causing the error
    dbms_output.put_line(day || ', ' || ftime);
END LOOP;
END;
/

【问题讨论】:

DTIME 列的数据类型是什么?您的代码假定它是一个日期。但我怀疑它是。 DTIME 是一个 varchar(4),在下午 4:00 看起来像“1600”,或者在下午 3:30 看起来像“1530”,等等。 【参考方案1】:

由于 DTIME 不是日期类型,因此不能将 TO_CHAR 与日期格式一起使用。如果它是零填充到 4 个字符的长度,你可以像这样简化它:

ftime := to_date(to_char(day, 'DD-MON-YYYY') || ' ' || entry.dtime, 'DD-MON-YYYY HH24MI');

【讨论】:

【参考方案2】:

如果可以的话,我认为你最好避免使用 to_char,并尝试坚持使用以原生日期格式返回值的函数,这样你可能也不需要在你的字符串上运行 to_date 命令,你可能会取得一些成功与以下或密切相关的:

ftime := Trunc(Sysdate) || ' ' || Extract(Hour From entry.dtime) || ':' Extract(Minute From entry.dtime)

祝你好运

【讨论】:

我把我的线路改为你的线路,但没有运气。我得到一个 ORA-01830:日期格式图片在转换整个输入字符串之前结束。 day := to_date(entry.fdate, 'DD-MON-YYYY'); ftime := 天 || '' || to_date(entry.dtime, 'HH24MI'); 抱歉,我不知道您的 Dtime 被格式化为 varchar,这就是 Extract 函数不起作用的原因,Codo 的答案就是这种情况。

以上是关于Oracle/SQL:将日期和时间连接成单个日期值时的数字格式模型无效的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL 多列与单个范围/图例对齐

来自单个表的平均出生日期(oracle sql)

oracle SQL语句,日期格式转换

加入两个表,只显示唯一值和最大日期

返回从最新日期算起的最后 365 内的值 ORACLE SQL

Oracle SQL:从时间戳时区中提取日期和时间