如何解决Oracle在特定时间删除数据的问题?

hgc7kmma  于 2023-06-05  发布在  Oracle
关注(0)|答案(1)|浏览(447)

我的SQL语句如下:delete from "result" where DATA_DATE < TO_DATE('2023-04-06 00:00:00', 'YYYY-MM-DD HH24-MI-SS')错误消息为:ORA-01861: literal does not match format string我该怎么办?
这是表中信息的一部分:enter image description here

pjngdqdw

pjngdqdw1#

如果DATA_DATE列存储为DATE数据类型:

CREATE TABLE "result" (data_date DATE);

INSERT INTO "result" (data_date)
VALUES (TO_DATE('2023-04-05 12:34:56', 'YYYY-MM-DD HH24-MI-SS'));

然后你的查询工作:

delete from "result"
where DATA_DATE < TO_DATE('2023-04-06 00:00:00', 'YYYY-MM-DD HH24-MI-SS');

如果DATA_DATE列是字符串数据类型:

CREATE TABLE "result" (data_date VARCHAR2(19));

INSERT INTO "result" (data_date) VALUES ('2023-04-05 12:34:56');

然后您的查询:

delete from "result"
where DATA_DATE < TO_DATE('2023-04-06 00:00:00', 'YYYY-MM-DD HH24-MI-SS');

正在将字符串与日期进行比较,Oracle将隐式地将字符串转换为日期,以便比较相同的数据类型,并且查询有效地:

delete from "result"
where TO_DATE(
        DATA_DATE,
        (SELECT value FROM nls_session_parameters WHERE parameter = 'NLS_DATE_FORMAT')
      )
      < TO_DATE('2023-04-06 00:00:00', 'YYYY-MM-DD HH24-MI-SS');

如果NLS_DATE_FORMAT会话参数匹配:

ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';

然后查询工作。
但如果会话参数不匹配:

ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY';

然后你可能会得到错误:

ORA-01861: literal does not match format string

要解决此问题,请执行以下操作:
1.始终将日期存储为DATE数据类型(而不是字符串)。

  • 不要比较不同的数据类型,因为Oracle将执行隐式类型转换,以便可以比较它们。
  • 将两边作为字符串进行比较:
delete from "result"
where DATA_DATE < '2023-04-06 00:00:00';
  • 或者把两边作为日期来比较:
delete from "result"
where TO_DATE(data_date, 'YYYY-MM-DD HH24:MI:SS')
      < TO_DATE('2023-04-06 00:00:00', 'YYYY-MM-DD HH24:MI:SS');
  • 设置NLS_DATE_FORMAT以便隐式转换工作。

而任何一种选择都会起作用;你应该使用#1并修复你的表,以便数据以正确的数据类型存储。如果你真的不能改变表,那么使用#2,并确保你的查询是比较相同的数据类型(如果需要,使用类型之间的显式转换)。选项#3只是为了完整性,它只会让你继续使用依赖隐式类型转换的坏习惯;别用它。
fiddle

相关问题