T-SQL для удалений на основе многоуровневой даты и времени - PullRequest
0 голосов
/ 31 октября 2010

У меня есть таблица, в которой хранятся ревизии определенных наборов данных (т. Е. Редактирование во времени, если хотите). Дата пересмотра неимитативно сохраняется как поле datetime с именем revision.

Каждая новая редакция принимается ежедневно, в полночь.

Если эту таблицу оставить заполненной, для каждого дня будет набор строк, где каждый набор строк будет иметь одно и то же поле revision datetime, например 2010-10-31 00:00:00.

Я хотел бы реализовать хранимую процедуру как задание, которое по существу выполняется ежедневно и очищает количество ревизий в этой таблице на основе критериев, аналогичных тому, как функции Time Machine работают в OS X. А именно, ревизии в хранится должно быть:

  • одна редакция каждый день на прошлой неделе (начиная с еженедельной редакции ниже)
  • одна редакция каждую неделю за каждую неделю после этого (полночная редакция утреннего понедельника)
  • одна ревизия каждый месяц для ревизий старше года (полуночная ревизия первого дня месяца)

Так, например, сейчас я ожидаю увидеть следующие ревизии:

  • 2010-10-30 (ежедневно)
  • 2010-10-29 (ежедневно)
  • 2010-10-28 (ежедневно)
  • 2010-10-27 (ежедневно)
  • 2010-10-26 (ежедневно)
  • 2010-10-25 (ежедневно / еженедельно)
  • 2010-10-18 (еженедельно)
  • 2010-10-11 (еженедельно)
  • 2010-10-04 (еженедельно)
  • 2010-09-27 (еженедельно)
  • ...

Это, конечно, с учетом того, что моему набору данных еще не год.

Итак, что является лучшим и кратким DELETE FROM для достижения этой цели? Спасибо!

1 Ответ

0 голосов
/ 31 октября 2010

В каждом случае

  • В прошлые выходные: просто отфильтруйте < DATEADD(day, -8, GETDATE()), потому что обработка не требуется.(учитывает временную составляющую и предполагает выполнение очистки после полуночи)

  • Между неделей назад и годом назад: используйте DATEPART(weekday, revision) <> 2.Зависит от @@ datefirst.

  • Более года назад: используйте DATEPART(day, revision) <> 1

Итак, что-то вроде, но не проверено ...

DELETE
   MyTable
WHERE
   Revision < DATEADD(day, -8, GETDATE())
   AND
   (
   Revision > DATEADD(year, -1, GETDATE()) AND DATEPART(weekday, revision) <> 2
   OR --Must be > 1 year ago)
   Revision < DATEPART(month, revision) <> 1)
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...