我想删除最后一天的行,我有一个日期列,如何在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。