Sql 使用不同的日期值更新oracle日期列

Sql 使用不同的日期值更新oracle日期列,sql,oracle,sql-update,Sql,Oracle,Sql Update,当更新旧日期为新日期时,我得到 SQL错误:ORA-00932:不一致的数据类型:预期的日期为 93200000-“不一致的数据类型:应为%s获得%s” 使用显式DATEliterals表达逻辑是否解决了问题 UPDATE test SET date1 = (CASE date1 WHEN DATE '2019-10-22' THEN DATE '2019-10-23' WHEN DATE '2019-1

当更新旧日期为新日期时,我得到

SQL错误:ORA-00932:不一致的数据类型:预期的日期为 93200000-“不一致的数据类型:应为%s获得%s”


使用显式
DATE
literals表达逻辑是否解决了问题

UPDATE test
    SET date1 = (CASE date1
                     WHEN DATE '2019-10-22' THEN DATE '2019-10-23'
                     WHEN DATE '2019-10-21' THEN DATE '2019-10-22'
                     . . .
                 END);

正如错误消息所暗示的,您混合了日期和varchar


您当前的查询将把案例中未包含的所有其他日期更新为NULL。最好对日期文字使用WHERE条件,然后只需添加1天:

UPDATE test
SET date1 = date1 + 1
WHERE DATE1 IN
 ( DATE '2019-10-22'
  ,DATE '2019-10-21'
  ,DATE '2019-10-20'
  , etc.
 )
这将有助于:

update test 
set date1 = 
(
    case date1
       when to_date('22-OCT-19', 'dd-mon-yyyy') THEN to_date('23-OCT-19', 'dd-mon-yyyy')
       else date1
    end
);

以下是

您当前的查询将把案例中未包含的所有其他日期更新为空。您最好在这些日期中使用WHERE条件,然后简单地加上1天。@dnoeth我相信通过在我的答案中使用我的示例,OP将避免……我认为这对此类数据不起作用。演示:它失败了,因为您插入的日期是0019年,而不是2019年,两位数的年份是不好的:-)请看,当您切换到标准SQL日期文字时,它要短得多,并且不再需要
to_date
,因为只有一种格式
YYYY-MM-DD
我插入了OP在他问题中提到的日期“当'19年10月22日'然后'19年10月23日'"... 我假设OP在他的桌子上就是这样做的。我试过了,但没有成功:@VBokšIć。SQL FIDLE中没有错误。我同意,但它不会更新日期:当日期“2019-10-22”时,然后是日期“2019-10-23”?@VBokšIć。您可能只需要在
更新
之后进行
提交
——这在Oracle的Fiddle环境中很难做到。我的示例不需要任何提交,从这个角度来看,我已经对您的代码和OP中接受的代码进行了注释。如您所见
update test 
set date1 = 
(
    case date1
       when to_date('22-OCT-19', 'dd-mon-yyyy') THEN to_date('23-OCT-19', 'dd-mon-yyyy')
       else date1
    end
);