如何在时间未知时按日期删除行

时间:2016-10-20 16:41:52

标签: sql oracle

我正在尝试从我的表中删除给定日期的行。目前,它仅在我按如下方式格式化时才有效:

delete from table_name 
where date_entered = to_date('20-SEP-15 11:10:35', 'dd-MON-yy hh:mi:ss');

如果我省去时间,它只会返回“删除0行”。如果某一天的大量条目都发生在不同的时间,那么输入每个条目的确切时间以便全部删除它们是不可行的,尤其是在时间不能自动显示的情况下。

4 个答案:

答案 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
;