Как отфильтровать записи по значению поля формата Дата/время?
Хочу организовать фильтрацию записей по дате: TDataGrid, TQuery.
Поле формата: Дата/время - dd.mm.yyyy hh:mm:ss
Пытаюсь следующим образом:
Filtered := false;
Filter := '[Дата] = ' + QuotedStr(DateToStr(Date()));
Filtered := true;
end;
Записи не находятся, и понятно почему: в какждом поле еще и время.
А вот как мне учитывать только дату. Нечто подобное не проходит:
Вообще возможно ли сделать что-либо подобное с уже имеющимся набором? Или же придется формировать новый запрос и снова обращаться к БД?
И все-таки, каким-то образом задача решается без повторного обращения к базе данных?
2. Если время не используется, то при добавлении записи в таблицу обнуляй его, и проблем не возникнет.
(#Дата#)
Извини, я немного не понял, что ты имеешь ввиду:)
Я пытаюсь в программе организовать журнал событий. Фиксирую операции, которые производят пользователи. Журнал быстро заполняется - пользователей много. Соответственно, чтобы найти нужные записи, хочется реализовать ряд фильтров: по дате, временному интервалу и т.д. и т.п.
Пробовал хранить данные в обыкновенном текстовом поле (одно для времени, другое для даты). Манипулировать поначалу проще. Когда добрался до задачи организации фильтров столкнулся со следующей проблемой: некорректно работает оператор BETWEEN со строками. К примеру если задать запрос на выборку - корректно отображает даты только в пределах месяца (между, например, 01.01.2007 и 31.01.2007). Ну и предполагаю - не пробовал, что вычислять разницу между датами функцией DATEDIFF, тоже наверное не получится.
2. Если время не используется, то при добавлении записи в таблицу обнуляй его, и проблем не возникнет.
Время в программе предполагается использовать.
Что касается повторного запроса к БД - очень не хочется, т.к. нагрузка и так достаточно большая. Было бы здорово работать с полученным набором записей...
Вообще, как организована работа этого фильтра? Нельзя ли как-нибудь наложить какое-то условие на поле ПЕРЕД тем как будет выполняться проверка. Т.е. я хочу сказать следующее: к примеру, поле содержит - 01.01.2007 10:12:12, а оцениваться оно будет как 01.01.2007 (т.е. отсекаем время).
(#Дата#)
Сделал:
Filter := '[Дата] = #' + DateToStr(Date()) + '#';
Получил:
'Item cannot be found in the collection corresponding to the requested name or ordinal'
Кстати, скажи, что за СУБД используешь? # - это для Access. SQL Server, например, позволяет указать даты в кавычках...
Кстати, скажи, что за СУБД используешь? # - это для Access. SQL Server, например, позволяет указать даты в кавычках...
Хмм.. теперь понятно, что ты имел ввиду. Сейчас попробую.
На работающей системе - СУБД Access.
Сейчас делаю более толковый вариант. Здесь у меня Access по умолчанию для совместимости. Планируется перевод на MSSQL 2005 Express.
Для Access как я понимаю: [Дата] BETWEEN #01.01.2007 00:00:00.000# AND #01.01.2007 23:59:59.999#?
Спасибо большое за участие)
Для Access как я понимаю: [Дата] BETWEEN #01.01.2007 00:00:00.000# AND #01.01.2007 23:59:59.999#?
Нет, так это не работает(
Работает так: BETWEEN #06/09/2007 00:00:00# AND #06/09/2007 23:59:59#
А из дельфи дата получается в виде 01.01.2007:
' AND #' + DateToStr(Date()) + ' 23:59:59#';
Как ее привести к виду: mm/dd/yyyy?
Да, пробовал так:
Не вышло...
FROM JournalEvents
WHERE JournalEvents.Record_date BETWEEN Format('09.06.2007 00:00:00', "dd/mm/yyyy hh:mm:ss") AND Format('09.06.2007 23:59:59', "dd/mm/yyyy hh:mm:ss")
ORDER BY id;
Соответственно, формирую строку фильтра:
' AND Format(''' + DateToStr(Date()) + ' 23:59:59'', "dd/mm/yyyy hh:mm:ss")';
Сообщение:
'Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another'
:-(
FROM JournalEvents
WHERE JournalEvents.Record_date BETWEEN Format('09.06.2007 00:00:00', "dd/mm/yyyy hh:mm:ss") AND Format('09.06.2007 23:59:59', "dd/mm/yyyy hh:mm:ss")
ORDER BY id;
Этот запрос не будет работать в Access. Access Должен принять строку, а не коктейль из строк и функций.
Думаю, что твой фильтр должен быть примерно таким:
'# AND #' + FormatDateTime("dd/mm/yyyy hh:mm:ss", EncodeDate(2007,6,10)) + '#;';