我们有一种情况,我们在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的行.我使用长度函数进行了三次尝试,但我认为这仅适用于字符串.有没有办法做到这一点.谢谢任何可以帮助我的人.
日期没有格式; 你只看到它是如何显示的.但是,问题的答案实际上就是你所说的:
我想为它添加一个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设置,因此在逐个会话的基础上可能会有所不同.处理日期时始终使用日期功能.
| 归档时间: |
|
| 查看次数: |
548 次 |
| 最近记录: |