在ANSI SQL中按日期删除行

时间:2014-09-17 14:28:24

标签: sql ansi-sql

我想从去年删除行,我有一个日期列,我该如何在ansi中执行此操作?

delete from mytable where mydate < current_date;

此查询删除昨天和今天的记录,我想保留今天的记录(“今天”是从上午12点开始)

1 个答案:

答案 0 :(得分:1)

您的语句是有效的ANSI SQL,适用于任何符合ANSI {1}}处理规范的DBMS。

对于Oracle,情况有所不同:DATE列/值也始终包含时间。因此,DATE(或current_date为了讨论而相同)将不会返回sysdate,但是2014-09-17

现在,如果您的表格中有一行包含2014-09-17 16:54:12,则条件2014-09-17 08:54:12将为真,因为mydate < current_date小于08:54:12,因此该行将被删除。

您需要将语句重写为:

16:54:12

delete from mytable where trunc(mydate) < trunc(current_date); trunc()的时间部分设置为DATE,因此比较的行为就好像没有时间部分涉及(因为它们对于两个比较都是相同的值)。

如果您确实需要在ANSI SQL中编写此条件并考虑Oracle的非标准DATE处理,则需要执行以下操作:

00:00:00

显示的select * from mytable where (extract(year from mydate) < extract(year from current_date)) or (extract(year from mydate) = extract(year from current_date) and extract(month from mydate) < extract(month from current_date)) or (extract(year from mydate) = extract(year from current_date) and extract(month from mydate) = extract(month from current_date) and extract(day from mydate) < extract(day from current_date)); 函数是ANSI SQL。