我正在尝试从我的表中删除给定日期的行。目前,它仅在我按如下方式格式化时才有效:
delete from table_name
where date_entered = to_date('20-SEP-15 11:10:35', 'dd-MON-yy hh:mi:ss');
如果我省去时间,它只会返回“删除0行”。如果某一天的大量条目都发生在不同的时间,那么输入每个条目的确切时间以便全部删除它们是不可行的,尤其是在时间不能自动显示的情况下。
答案 0 :(得分:5)
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'))
...这与您从我的查询中获得的计划类似;除了它使用<=
而不是<
。效果是一样的(只要它是一个日期字段而不是时间戳)。
答案 1 :(得分:4)
如果您有日期时间字段,则应按日期范围删除。确保不要将字段包装在函数中以避免全表扫描:
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');
假设你在date_entered字段上有一个索引。
答案 2 :(得分:0)
使用Oracle的trunc()
函数 - 它会从日期时间值中删除时间。
delete from table_name where trunc(date_entered) = to_date('20-SEP-15', 'dd-MON-yy');
答案 3 :(得分:0)
这是ANSI / ISO SQL中日期和时间戳文字的样子。 大多数数据库(如果不是全部)都支持该语法。
select timestamp '2015-09-20 11:10:35'
,date '2015-09-20'
from dual
;