Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.08.2017, 10:06   #1
Jakyll
 
Регистрация: 06.08.2017
Сообщений: 8
По умолчанию Фильтрация с даты по дату

Добрый день!
Подскажите пожалуйста в чем моя ошибка.
Процедура должна фильтровать данные за период от дата1 по дата2, но
выводит данные только если дата1 = дата2, при условие что в БД есть записи за это дату.Второй день уже бьюсь над проблемой.
Работаю в Delphi XE5, СУБД FireBird 2.5.
Код:
procedure TMainForm.Button1Click(Sender: TObject);
var
  dt1, dt2: TDateTime;
begin
  with IBQuery1 do
  begin
    IBQuery1.SQL.Clear;
    IBQuery1.Close;
    IBQuery1.SQL.Add
      ('Select * from profit WHERE n_date BETWEEN :date1 and :date2');
    dt1 := Trunc(DateTimePicker1.Date);
    dt2 := Trunc(DateTimePicker2.Date);
    IBQuery1.Params.ParamByName('date1').AsDate := dt1;
    IBQuery1.Params.ParamByName('date2').AsDate := dt2;
    IBQuery1.Open;
  end;
end;
Jakyll вне форума Ответить с цитированием
Старый 21.08.2017, 10:13   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

а время есть в n_date? Если есть, то dt2 на единичку увеличь
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.08.2017, 10:15   #3
Jakyll
 
Регистрация: 06.08.2017
Сообщений: 8
По умолчанию

нет, только дата.
Jakyll вне форума Ответить с цитированием
Старый 21.08.2017, 10:20   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

По коду все Ok. Не понятно зачем with IBQuery1, но это не критично
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.08.2017, 10:22   #5
Jakyll
 
Регистрация: 06.08.2017
Сообщений: 8
По умолчанию

Вот и я в тупике
Jakyll вне форума Ответить с цитированием
Старый 21.08.2017, 10:26   #6
Jakyll
 
Регистрация: 06.08.2017
Сообщений: 8
По умолчанию

Наглядная демонстрация, может так кому-то понятней будет.
Изображения
Тип файла: png 1.png (13.7 Кб, 141 просмотров)
Тип файла: png 2.png (10.3 Кб, 83 просмотров)
Jakyll вне форума Ответить с цитированием
Старый 21.08.2017, 10:38   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Jakyll Посмотреть сообщение
Наглядная демонстрация, может так кому-то понятней будет.
Изображения
покажите, пожалуйста, структуру таблицы profit (с типами полей)

есть подозрение, что у Вас тип поля n_date не является полем с типом date/datetime.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.08.2017, 20:27   #8
Jakyll
 
Регистрация: 06.08.2017
Сообщений: 8
По умолчанию

Вот, стоит тип Date.
Изображения
Тип файла: png Безымянный.png (20.9 Кб, 135 просмотров)
Jakyll вне форума Ответить с цитированием
Старый 21.08.2017, 22:13   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Jakyll Посмотреть сообщение
Вот, стоит тип Date.
да, реально не вижу косяков.

значит, придётся танцевать с бубном...

попробуйте
1)

Код:
var
  dt1, dt2: TDateTime;
begin
    IBQuery1.Close;
    IBQuery1.SQL.Clear;
    IBQuery1.SQL.Add
      ('Select * from profit WHERE n_date BETWEEN :date1 and :date2');
    IBQuery1.Prepare;
    dt1 := Trunc(DateTimePicker1.Date);
    dt2 := Trunc(DateTimePicker2.Date);
    IBQuery1.ParamByName('date1').AsDate := dt1;
    IBQuery1.ParamByName('date2').AsDate := dt2;
    IBQuery1.Open;
end;
2)

Код:
var
  dt1, dt2: TDateTime;
begin
    IBQuery1.Close;
    IBQuery1.SQL.Clear;
    IBQuery1.SQL.Add
      ('Select * from profit WHERE n_date >= :date1 and n_date <= :date2');
    IBQuery1.Prepare;
    dt1 := Trunc(DateTimePicker1.Date);
    dt2 := Trunc(DateTimePicker2.Date);
    IBQuery1.ParamByName('date1').AsDate := dt1;
    IBQuery1.ParamByName('date2').AsDate := dt2;
    IBQuery1.Open;
end;
результат?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.08.2017, 00:11   #10
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Стесняюсь спросить: а какой диалект у БД?

А то я тут у ембаркадеров нашёл интересное описание: http://docwiki.embarcadero.com/Inter...AMP_Data_Types

Ну ещё варианты кода:

Код:
    IBQuery1.ParamByName('date1').Value:= dt1;
    IBQuery1.ParamByName('date2').Value:= dt2;
либо

Код:
    IBQuery1.ParamByName('date1').AsDate := DateTimePicker1.Date;
    IBQuery1.ParamByName('date2').AsDate := DateTimePicker2.Date;
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 22.08.2017 в 00:14.
Sciv вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Фильтрация даты через ibtable vbn1 БД в Delphi 5 13.06.2014 13:07
отнять дату от даты promt JavaScript, Ajax 2 27.01.2013 21:27
Фильтрация данных по диапазону даты? sctr84 БД в Delphi 2 05.03.2012 08:55
преобразование дАтЫ в дату suxo Microsoft Office Excel 7 01.06.2010 10:10
Фильтрация даты DElib БД в Delphi 1 25.04.2010 21:03