Oracle - 检索具有时间戳值的日期

时间:2013-04-17 10:34:13

标签: oracle timestamp

我们有一种情况,我们在Oracle DB中有一个表(比如表单),它有一个类型为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的行。我使用长度函数进行了三重奏,但我认为这仅适用于Strings。有没有办法做到这一点。谢谢任何可以帮助我的人。

1 个答案:

答案 0 :(得分:5)

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

  

我想为它添加一个where子句,因此它只更新坏数据。

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

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

为确保不再发生这种情况,您可以在表格中添加check constraint

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

我会建议反对以上的所有。不要破坏潜在有用的数据。您只需选择trunc(edition_date)您不想要的时间。您可能希望将来使用该时间。

你是对的,不要将LENGTH()等用于日期,这取决于你的NLS_DATE_FORMAT设置,因此在逐个会话的基础上可能会有所不同。处理日期时始终使用日期功能。

相关问题