在ANSI SQL中按日期删除行



我想删除最后一天的行,我有一个日期列,如何在ansi中做到这一点?

delete from mytable where mydate < current_date;

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

您的语句是有效的ANSI SQL,并且将适用于任何在DATE处理方面符合ANSI SQL规范的DBMS。

对于Oracle,情况有所不同:DATE列/值也总是包含一个时间。因此current_date(或sysdate,出于本讨论的目的,其相同)将不返回2014-09-17,而是例如返回2014-09-17 16:54:12

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

您需要将您的声明重写为:

delete from mytable 
where trunc(mydate) < trunc(current_date);

trunc()DATE的时间部分设置为00:00:00,因此比较的行为就像不涉及时间部分一样(因为两个比较值都相同)。

如果你真的,真的需要在ANSI SQL中编写这个条件,并考虑到Oracle的非标准日期处理,你需要做这样的事情:

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));

如图所示的extract()函数是ANSI SQL。

最新更新