2

我们有一种情况,我们在 Oracle DB 中有一个表(比如 Forms),其中有一个类型为 date 的列(比如 edition_date)。它严格意味着以 YYYY-MM-DD(例如:2012-11-23)格式保存没有时间戳值的日期信息。

不幸的是,由于代码问题,很多行都是用时间戳值创建的。该表中有大量记录,我只想更新那些包含这些不良数据的行。我可以使用查询来做到这一点

UPDATE forms SET edition_date = TRUNC( edition_date ) 

我想给它添加一个 where 子句,所以它只更新坏数据。问题是,我不确定如何检索那些添加了时间戳的行。以下是我拥有的数据的快照:

    FORM_ID    EDITION_DATE
    5          2012-11-23
    6          2012-11-23 11:00:15
    ..
    11         2010-07-11 15:23:22
    ..
    13         2011-12-31 

我只想检索表单 ID 为 6 和 11 的行。我尝试使用长度函数,但我认为这仅适用于字符串。有没有办法做到这一点。感谢任何可以帮助我的人。

4

1 回答 1

5

日期没有格式;你只看到它是如何显示的。但是,您的问题的答案实际上是您所说的:

我想给它添加一个 where 子句,所以它只更新坏数据。

因此,日期不等于没有时间的日期:

update forms
   set edition_date = trunc(edition_date)
 where edition_date <> trunc(edition_date)

为确保不再发生这种情况,您可以向表中添加检查约束

alter table forms 
  add constraint chk_forms_edition_date
      check ( edition_date = trunc(edition_date) );

我建议不要使用上述所有方法。不要破坏可能有用的数据。你应该简单地选择trunc(edition_date)你不想要时间的地方。您可能希望在将来使用该时间。

你是对的,不要使用 LENGTH() 等作为日期,这取决于你的NLS_DATE_FORMAT设置,因此可能会因会话而异。处理日期时始终使用日期函数。

于 2013-04-17T10:41:54.907 回答