我正在尝试从我的表中删除给定日期的行。目前,它仅在我按如下格式设置时才有效:
delete from table_name
where date_entered = to_date('20-SEP-15 11:10:35', 'dd-MON-yy hh:mi:ss');
如果我省略了时间,它只会返回“0 行已删除”。如果某一天的大量条目都发生在不同的时间,那么为每个条目输入准确的时间以将其全部删除是不可行的,尤其是在时间不会自动显示的情况下。
最佳答案
between
方法有效,但我更喜欢:
delete from table_name
where date_entered >= to_date('20-SEP-15', 'dd-MON-yy')
and date_entered < to_date('21-SEP-15', 'dd-MON-yy');
Oracle 在后台转换为该形式:
explain plan for
delete from table_name
where date_entered between to_date('20-SEP-15 00:00:00', 'dd-MON-yy hh:mi:ss')
and to_date('20-SEP-15 23:59:59', 'dd-MON-yy hh:mi:ss');
select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------
Plan hash value: 4143694936
---------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------
| 0 | DELETE STATEMENT | | 1 | 9 | 1 (0)| 00:00:01 |
| 1 | DELETE | TABLE_NAME | | | | |
|* 2 | FILTER | | | | | |
|* 3 | INDEX RANGE SCAN| INDEX_NAME | 1 | 9 | 1 (0)| 00:00:01 |
---------------------------------------------------------------------------------
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter(TO_DATE('20-SEP-15 23:59:59','dd-MON-yy
hh:mi:ss')>=TO_DATE('20-SEP-15 00:00:00','dd-MON-yy hh:mi:ss'))
3 - access("DATE_ENTERED">=TO_DATE('20-SEP-15 00:00:00','dd-MON-yy
hh:mi:ss') AND "DATE_ENTERED"<=TO_DATE('20-SEP-15 23:59:59','dd-MON-yy
hh:mi:ss'))
...这与您从我的查询中获得的计划类似;除了它使用 <=
而不是 <
.效果是一样的(只要它是日期字段而不是时间戳)。
关于sql - 如何在时间未知时按日期删除行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40160021/