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

Oracle-检索具有时间戳值的日期,oracle,timestamp,Oracle,Timestamp,我们有一种情况,在Oracle DB中有一个表(比如Forms),其中有一个日期类型的列(比如edition_date)。严格来说,它是为了以YYYY-MM-DD(ex:2012-11-23)格式保存日期信息,没有时间戳值 不幸的是,由于代码问题,创建了很多带有时间戳值的行。这个表中有很多记录,我只想更新那些有这些坏数据的行。我可以使用查询来实现这一点 UPDATE forms SET edition_date = TRUNC( edition_date ) 我想给它添加一个where子句,

我们有一种情况,在Oracle DB中有一个表(比如Forms),其中有一个日期类型的列(比如edition_date)。严格来说,它是为了以YYYY-MM-DD(ex: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的行。我使用了长度函数,但我认为这只适用于字符串。有没有办法做到这一点。谢谢任何能帮助我的人。

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

我想给它添加一个where子句,这样它只更新坏数据

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

update forms
   set edition_date = trunc(edition_date)
 where edition_date <> trunc(edition_date)
我建议不要做上述所有事情。不要破坏可能有用的数据。您只需在不需要时间的地方选择
trunc(edition\u date)
。你可能想在将来利用这段时间


您是正确的,不要将LENGTH()等用于日期,这取决于您的设置,因此每个会话可能会有所不同。在处理日期时始终使用日期函数。

+1对于这些技术,我认为在不了解更多时间戳来源的情况下,建议不要实现它们可能过于草率。例如,它可能与日期无关,但可能是创建记录的时间的工件。关于检查约束的简要说明——我当然会这样做,但要注意某些版本(我认为是10.2版)中的一个优化问题,它导致约束也被用作谓词,人为地减少了估计基数。谢谢Ben。我认为你的建议非常棒,我会处理好我对任何不需要的更新的担忧。我同意你不删除时间戳,因为它实际上提供了额外的数据。我仍在与我们的客户讨论这个问题,希望他们会同意这个建议。
alter table forms 
  add constraint chk_forms_edition_date
      check ( edition_date = trunc(edition_date) );