Ваше заявление действует ANSI SQL и будет работать на любой СУБД, которая соответствует с спецификацией ANSI SQL в отношении обработки DATE
.
С Oracle ситуация другая: столбец 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
в 00:00:00
и, таким образом, сравнение ведет себя так, как будто не было времени часть не включает в себя (потому что это то же самое для обоих сравнения значения).
Если вы действительно, действительно нужно, чтобы написать это условие в ANSI SQL и принимать нестандартные DATE 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 ,
Это должно работать (это происходит в Postgres). Но даже если вы конкретно упоминаете ANSI SQL, могут существовать СУБД, которые ведут себя по-разному. Я предполагаю, что вы используете Oracle, который объяснил бы это поведение. –
Какая БД вы используете? –
@a_horse_with_no_name да, я использую oracle, но мне нужно сделать это в ansi –