Удаление данных в таблице по Date

co-ad
Дата: 13.10.2003 12:42:16
Помоги составить запрос:
требуется в таблице удалять все данные старше например трех месяцев.
Есть поле logtime по которому это можно сделать. (Формат 2003-Mounth-Day 19:00:00)
Я думаю что это надо делать с помощью datepart и getdate(), но в один запрос собрать не могу.
Плохо знаком с функцией datepart. :(( ругается
Glory
Дата: 13.10.2003 12:46:48
declare @d1 datetime, @d2 datetime

set @d2 = getdate()
set @d1 = dateadd(mm, -1, @d2)

delete mytable where logtime between @d1 and @d2
tpg
Дата: 13.10.2003 12:47:45
delete from tab where datediff(m, logtime, getdate())>=3
ququ
Дата: 13.10.2003 14:25:37
При наличии индекса по полю logtime вариант Glory будет побыстрее.
co-ad
Дата: 13.10.2003 14:40:28
Всем спасибо большое..
Индекс по таблице есть...
Блин а мне больше понравился вариант tpg. Запрос выполнялся 42 минуты и удалил (2437797 row(s) affected) :(((
Но в след раз сделаю по другому. (Джоб хочу такой сделать раз в неделю например)


ququ
А почему интересно быстрее то. datediff по другому работает что ли?
Смысл то один.
Glory
Дата: 13.10.2003 15:26:24
А почему интересно быстрее то. datediff по другому работает что ли?

При использовании datediff сервер вынужден сканировать всю таблицу. По другому он не сможет вычислить значение этой функции и сравнить его с заданным.
При использовании же between @d1 and @d2 на основе индекс можно получить список удаляемых записей гораздо быстрее. Индекс должен быть разумеется по полю logtime.
co-ad
Дата: 13.10.2003 15:43:44
В догонку еще один вопрос в тему:
при написании такого запросика выборка теоретически предполагает хранение записей больше 3 месяцев.
а как и по дням "сечь"
т.е. сейчас результат запроса между датами: например от 2003-08-01 до 2003-10-13.
а нужно что было от 2003-08-13.
Glory
Дата: 13.10.2003 15:49:39
delete mytable where logtime < dateadd(mm, -1, getdate())
UNIVERSAL
Дата: 13.10.2003 17:33:51
Как-то странно вы записи удаляете, у которых дата свыше 3 мес. А если у записи дата 29.01.03 вы её удалите 01.04.03? Прикольно. Я бы dadediff делал по дням и свыше 90 дней удалял бы.