Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как отфильтровать записи по значению поля формата Дата/время?

375
08 июня 2007 года
dominator
199 / / 16.10.2003
Здравствуйте!
Хочу организовать фильтрацию записей по дате: TDataGrid, TQuery.
Поле формата: Дата/время - dd.mm.yyyy hh:mm:ss
Пытаюсь следующим образом:
 
Код:
with DataModule_Main.DataSource_Main.DataSet do begin
   Filtered := false;
   Filter := '[Дата] = ' + QuotedStr(DateToStr(Date()));
   Filtered := true;
end;

Записи не находятся, и понятно почему: в какждом поле еще и время.
А вот как мне учитывать только дату. Нечто подобное не проходит:
 
Код:
Filter := 'Format([Дата], "dd.mm.yyyy")' + ' = ' + QuotedStr(DateToStr(Date()));

Вообще возможно ли сделать что-либо подобное с уже имеющимся набором? Или же придется формировать новый запрос и снова обращаться к БД?
8
08 июня 2007 года
mfender
3.5K / / 15.06.2005
Время в этих полях представляет собой число Double, но никак не строку, вида dd.mm.yyyy
375
08 июня 2007 года
dominator
199 / / 16.10.2003
Цитата: mfender
Время в этих полях представляет собой число Double, но никак не строку, вида dd.mm.yyyy



И все-таки, каким-то образом задача решается без повторного обращения к базе данных?

303
09 июня 2007 года
makbeth
1.0K / / 25.11.2004
1. Может всетаки указывать не одну дату, а диапазон дат (например, между dd.mm.yyyy 00:00:00.000 и dd.mm.yyyy 23:59:59.999)?
2. Если время не используется, то при добавлении записи в таблицу обнуляй его, и проблем не возникнет.
247
09 июня 2007 года
wanja
1.2K / / 03.02.2003
Вокруг даты, прелбразованной в строку поставь #.
(#Дата#)
375
09 июня 2007 года
dominator
199 / / 16.10.2003
Цитата: makbeth
1. Может всетаки указывать не одну дату, а диапазон дат (например, между dd.mm.yyyy 00:00:00.000 и dd.mm.yyyy 23:59:59.999)?


Извини, я немного не понял, что ты имеешь ввиду:)
Я пытаюсь в программе организовать журнал событий. Фиксирую операции, которые производят пользователи. Журнал быстро заполняется - пользователей много. Соответственно, чтобы найти нужные записи, хочется реализовать ряд фильтров: по дате, временному интервалу и т.д. и т.п.
Пробовал хранить данные в обыкновенном текстовом поле (одно для времени, другое для даты). Манипулировать поначалу проще. Когда добрался до задачи организации фильтров столкнулся со следующей проблемой: некорректно работает оператор BETWEEN со строками. К примеру если задать запрос на выборку - корректно отображает даты только в пределах месяца (между, например, 01.01.2007 и 31.01.2007). Ну и предполагаю - не пробовал, что вычислять разницу между датами функцией DATEDIFF, тоже наверное не получится.

Цитата: makbeth

2. Если время не используется, то при добавлении записи в таблицу обнуляй его, и проблем не возникнет.


Время в программе предполагается использовать.

Что касается повторного запроса к БД - очень не хочется, т.к. нагрузка и так достаточно большая. Было бы здорово работать с полученным набором записей...
Вообще, как организована работа этого фильтра? Нельзя ли как-нибудь наложить какое-то условие на поле ПЕРЕД тем как будет выполняться проверка. Т.е. я хочу сказать следующее: к примеру, поле содержит - 01.01.2007 10:12:12, а оцениваться оно будет как 01.01.2007 (т.е. отсекаем время).

375
09 июня 2007 года
dominator
199 / / 16.10.2003
Цитата: wanja
Вокруг даты, прелбразованной в строку поставь #.
(#Дата#)


Сделал:
Filter := '[Дата] = #' + DateToStr(Date()) + '#';
Получил:
'Item cannot be found in the collection corresponding to the requested name or ordinal'

303
09 июня 2007 года
makbeth
1.0K / / 25.11.2004
dominator, ну дык и используй 2 даты. Например, чтобы отфильтровать все записи с датой 1 января 2007, нужно в фильтре указать даты между 01.01.2007 00:00:00.000 и 01.01.2007 23:59:59.999 ([Дата] BETWEEN '01.01.2007 00:00:00.000' AND '01.01.2007 23:59:59.999') В чем проблема-то?
Кстати, скажи, что за СУБД используешь? # - это для Access. SQL Server, например, позволяет указать даты в кавычках...
375
09 июня 2007 года
dominator
199 / / 16.10.2003
Цитата: makbeth
dominator, ну дык и используй 2 даты. Например, чтобы отфильтровать все записи с датой 1 января 2007, нужно в фильтре указать даты между 01.01.2007 00:00:00.000 и 01.01.2007 23:59:59.999 ([Дата] BETWEEN '01.01.2007 00:00:00.000' AND '01.01.2007 23:59:59.999') В чем проблема-то?
Кстати, скажи, что за СУБД используешь? # - это для 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#?
Спасибо большое за участие)

375
09 июня 2007 года
dominator
199 / / 16.10.2003
Цитата: dominator

Для 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:

 
Код:
Filter := '[Дата] = BETWEEN #' + DateToStr(Date()) + ' 00:00:00#' +
' AND #' + DateToStr(Date()) + ' 23:59:59#';

Как ее привести к виду: mm/dd/yyyy?
Да, пробовал так:
 
Код:
[Дата] = BETWEEN Format('09.06.2007 00:00:00', "dd.mm.yyyy hh:mi:ss") AND Format('09.06.2007 23:59:59', "dd.mm.yyyy hh:mi:ss")

Не вышло...
375
09 июня 2007 года
dominator
199 / / 16.10.2003
Такой вот запрос работает в ACCESS:
 
Код:
SELECT JournalEvents.id, JournalEvents.Record_date
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;

Соответственно, формирую строку фильтра:
 
Код:
Filter := '[Дата] = BETWEEN Format(''' + DateToStr(Date()) + ' 00:00:00'', "dd/mm/yyyy hh:mm:ss")' +
                  ' 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'
:-(
6.4K
11 июня 2007 года
Host
122 / / 22.09.2005
Цитата: dominator
Такой вот запрос работает в ACCESS:
 
Код:
SELECT JournalEvents.id, JournalEvents.Record_date
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 Должен принять строку, а не коктейль из строк и функций.

Думаю, что твой фильтр должен быть примерно таким:

 
Код:
Filter := '[Дата] = BETWEEN #' + FormatDateTime("dd/mm/yyyy hh:mm:ss", EncodeDate(2007,6,9)) +
'# AND #' + FormatDateTime("dd/mm/yyyy hh:mm:ss", EncodeDate(2007,6,10)) + '#;';
375
18 июня 2007 года
dominator
199 / / 16.10.2003
Спасибо, получилось:)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог