2014-09-17 1 views
-2

Я хочу удалить строки из последнего дня, у меня есть столбец даты, как я могу сделать это в ansi?Удалить строки по дате в ANSI SQL

delete from mytable where mydate < current_date; 

Этот запрос удаляет сегодняшние записи, как вчерашняя, и я хочу, чтобы сохранить сегодняшние записи («сегодня» от 12 часов и выше)

+1

Это должно работать (это происходит в Postgres). Но даже если вы конкретно упоминаете ANSI SQL, могут существовать СУБД, которые ведут себя по-разному. Я предполагаю, что вы используете Oracle, который объяснил бы это поведение. –

+0

Какая БД вы используете? –

+0

@a_horse_with_no_name да, я использую oracle, но мне нужно сделать это в ansi –

ответ

1

Ваше заявление действует 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 ,

+0

В любом случае 'trunc (current_date)' но верно 'trunc (mydate)' не нужно? В конце концов, если '' 2014-09-17 00:00:00 '