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

Chr*_*ris 2 oracle timestamp

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

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

UPDATE forms SET edition_date = TRUNC( edition_date ) 
Run Code Online (Sandbox Code Playgroud)

我想为它添加一个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 
Run Code Online (Sandbox Code Playgroud)

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

Ben*_*Ben 5

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

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

所以,如果日期不等于没有时间的日期:

update forms
   set edition_date = trunc(edition_date)
 where edition_date <> trunc(edition_date)
Run Code Online (Sandbox Code Playgroud)

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

alter table forms 
  add constraint chk_forms_edition_date
      check ( edition_date = trunc(edition_date) );
Run Code Online (Sandbox Code Playgroud)

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

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