Как применить фильтр Delphi ADOTable к типу данных даты

В MS Access я могу отфильтровать дату в запросе, как это: например,

SignUpDate > #31/12/2013#

это заставит базу данных показывать только записи, где SignUpDate находится в 2014 или новее

Как я буду делать это в Delphi?

dmGym.tblMembers.filter: = 'SignUpDate>' '# 31/12/2013 #' '', похоже, не работает

пожалуйста, помогите ему будет высоко ценится

4 ответа

Решение

Попробуйте dmGym.tblMembers.filter:= 'SignUpDate > # гггг / мм / дд #' (2013/12/31)

-кредит к комментарию кобика

Ты можешь попробовать:

dmGym.tblMembers.Filter:='SignUpDate > 31/12/2013';
dmGym.tblMembers.Filtered:=True;

Это заставит базу данных показывать только записи, где SignUpDate в 2014 году или новее.

Удачи.

Delphi хранит дату и время как действительное число. Сегодня 05 июня 2016 года, а промежуточная часть DateTime - 42 526. Нулевая дата - начало 1900 года. Вам нужно сгенерировать переменную с именем DateInt.

Var DateInt: целое число Date1: TDate; Начало DateInt:= Trunc(Date1)

Когда вы сохраняете дату, сохраняйте DateInt в обработчике событий BeforePost. Это дополнительное поле, но фильтрация теперь проста. Например, ваш фильтр теперь может быть

NewDateInt:= Trunc(Date1); Фильтр: = 'NewDate = DateInt';

Я думаю, что вам не нужно #с, попробуй

[...].Filter := '12/31/2013';  // this is for Sql Server and tested 
  //  for UK locale, for Access you may need to swap the dd and mm, 
  //and maybe even the yyyy as suggested by @kobik in a comment.

Если вы используете поле TDateTime в TAdoDataSet.Locate(), функция GetFilterStr подключает # выполняет вход для вас (и делает хэш (выделяет каламбур) при выполнении аналогичных действий для строковых полей - см. # знаки в ADO locates (Delphi XE5)).

Но установка простого фильтра для TAdoTable, кажется, обходит ADODB.GetFilterStr и выполняет прямое назначение свойству Filter его набора записей, поэтому я предполагаю, что если #Они необходимы, они должны быть подключены слоем ADO/MDac.

Другие вопросы по тегам