我想从去年删除行,我有一个日期列,我该如何在ansi中执行此操作?
delete from mytable where mydate < current_date;
此查询删除昨天和今天的记录,我想保留今天的记录(“今天”是从上午12点开始)
答案 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。