【发布时间】:2016-09-05 10:17:59
【问题描述】:
我正在尝试在 Oracle 12c 数据库表中执行批量数据更新,以获取与日期范围匹配的记录。日期有时间信息,所以我使用trunc() 函数去除时间部分。我可以使用此条件成功执行选择查询,但不知何故,使用相同 where 子句的更新与记录不匹配。有谁知道怎么回事?
select count(*) from TABLE_NAME
where TRUNC(DATE_FIELD) in ('30-Apr-13', '31-May-13', '31-Jul-13')
-- 554
但是..
update TABLE_NAME set SOME_FIELD = 'VALUE'
where TRUNC(DATE_FIELD) in ('30-Apr-13', '31-May-13', '31-Jul-13')
-- 0 rows updated.
--编辑--
我也试过to_date('30-Apr-13'), ...没有效果。
【问题讨论】:
-
SOME_FIELD是否有任何索引(主要是 UNIQUE)? -
您能否为表格和示例数据添加 DDL(以显示完整日期/时间的格式)?使用显式转换和格式掩码有什么不同吗?如果是这样,当您看到这种行为时,您的 NLS_DATE_FORMAT 是什么?
-
我无法重现“Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production”上的行为。我认为这种行为很奇怪。在此期间是否有其他人更改数据?
-
试试 ANSI 日期文字:
UPDATE table_name SET some_field = 'VALUE' WHERE TRUNC( date_field ) IN ( DATE '2013-04-30', DATE '2013-05-31', DATE '2014-07-31' ) -
@AlexPoole 你明白了!我必须在自动批处理加载程序中运行更新,该加载程序的日期格式与我用于选择的 sql 开发人员不同。对不起,应该提到这一点。一旦我将年份组件修改为完整形式,即 2013 年、2014 年,更新就成功了。请填写答案,以便我标记它。