В настоящее время я пишу приложение Delphi, которое выполняет запросы к базе данных DB2 с использованием ADO.
Одним из требований является то, что пользователь должен иметь возможность определять запросы, используя даты, например «показать мне все данные за последние 60 дней» или «показать все данные за период с 20 ноября 2009 года по 18 января 2010 года». Это не будет проблемой, за исключением двух фактов:
- Даты хранятся в базе данных, используя разные поля для дня, месяца и года.
- Базы данных использовались на нескольких клиентских сайтах в течение ряда лет и не могут быть изменены, поэтому приложение должно работать поверх существующих баз данных (поэтому не нужно изменять базу данных для хранения дат в одном поле, что приведет к задача намного проще).
Мне нужно знать, существует ли эффективный алгоритм построения SQL, необходимый для извлечения указанной информации из базы данных. Например, сегодня 18 января, поэтому для извлечения всей информации с 20 ноября по сегодняшний день мне понадобится оператор SQL, который выглядит примерно так:
SELECT data WHERE
((day >= 20) AND (month = 11) AND (year = 2009)) OR
((month = 12) AND (year = 2009)) OR
((day <= 18) AND (month = 1) AND (year = 2010))
Очевидно, что это тривиальный и относительно простой пример, но если бы пользователь захотел получить данные с ноября 2008 года, а не с 2009 года, запрос получился бы намного больше.
Это единственный способ, которым я могу построить оператор SQL, или есть более эффективный способ сделать это?