【问题标题】:Oracle - retrieve date having timestamp valuesOracle - 检索具有时间戳值的日期
【发布时间】:2013-04-17 10:34:13
【问题描述】:

我们有一种情况,我们在 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 的行。我尝试使用长度函数,但我认为这仅适用于字符串。有没有办法做到这一点。感谢任何可以帮助我的人。

【问题讨论】:

    标签: oracle timestamp


    【解决方案1】:

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

    我想给它添加一个 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 设置,因此可能会因会话而异。处理日期时始终使用日期函数。

    【讨论】:

    • 技术+1,但我认为在不了解时间戳来源的情况下建议不要实施它们可能是轻率的。例如,它可能根本与日期无关,但可能是记录创建时间的产物。关于检查约束的快速说明——我肯定会这样做,但要注意某些版本(我认为是 10.2)中的优化器问题,这导致约束也被用作人为降低估计基数的谓词。
    • 谢谢本。我认为您的建议很棒,并且会解决我对任何不需要的更新的担忧。我同意你不删除时间戳,因为它实际上提供了额外的数据。我仍在与我们的客户讨论这个问题,希望他们会同意这个建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 2020-04-22
    • 2021-07-24
    • 1970-01-01
    相关资源
    最近更新 更多