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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.05.2014, 13:01   #1
spotip
Пользователь
 
Регистрация: 09.06.2010
Сообщений: 68
По умолчанию Поиск по диапазону дат в dbgrideh

пытаюсь сделать поиск по диапазону дат база Microsoft sql server 2008r через связь ADOConnection,DataSource,ADOQuery, в базе колонка dt с датой, пытаюсь сделать поиск от и до:
Код:
var
dat1:TdateTime;
dat2:TdateTime;
begin
Datamodule2.Turb_Query2.Active:=false;
Datamodule2.Turb_Query2.SQL.Clear;
Datamodule2.Turb_Query2.SQL.Add('SELECT*');
Datamodule2.Turb_Query2.SQL.Add('FROM turb');
Datamodule2.Turb_Query2.SQL.Add('Where dt between :dat1 and: dat2');
dat1:=DateTimePicker1.Date;
dat2:=DateTimePicker2.Date;
Datamodule2.Turb_Query2.Parameters.ParamByName ('dat1').Value:= dat1;
Datamodule2.Turb_Query2.Parameters.ParamByName ('dat2').Value:= dat2;
Datamodule2.Turb_Query2.Active:=true;
пишет Parametr dat2 not found, подскажите где ошибка.
spotip вне форума Ответить с цитированием
Старый 07.05.2014, 13:09   #2
Toxa
Форумчанин Подтвердите свой е-майл
 
Аватар для Toxa
 
Регистрация: 01.12.2006
Сообщений: 514
По умолчанию

надо вот так
Код:
Datamodule2.Turb_Query2.SQL.Add('Where dt between :dat1 and :dat2');
чтобы query воспринимал dat2 как переменную, перед ней вплотную надо поставить двоеточие
Пишу на Delphi за еду
Toxa вне форума Ответить с цитированием
Старый 07.05.2014, 13:46   #3
spotip
Пользователь
 
Регистрация: 09.06.2010
Сообщений: 68
По умолчанию

Цитата:
Сообщение от Toxa Посмотреть сообщение
надо вот так
Код:
Datamodule2.Turb_Query2.SQL.Add('Where dt between :dat1 and :dat2');
чтобы query воспринимал dat2 как переменную, перед ней вплотную надо поставить двоеточие
да помогло спасибо, ещё можно уточнить, выдаёт немного не так как я хочу, т.е есть даты например 1, 2, 3, в бд в поиске ввожу искать с 1 ого по 2 ое число 1 вое число почему то не отображает и так далее, и ещё вопрос как сбросить сей поиск, т.е как вернуть dbgrid в состояние до нажатия поиска.
spotip вне форума Ответить с цитированием
Старый 07.05.2014, 13:48   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
почему то не отображает
Убери время из dat1 и dat2
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 07.05.2014, 14:14   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Убери время из dat1 и dat2
абсолютно согласен.

причём время может мешать с двух сторон (как со стороны параметров, куда они попадают из DateTimePicker'ов, так и со стороны поля dt в БД).

я бы начал с того, что отбросил время в параметрах:
Код:
dat1 := Trunc(DateTimePicker1.Date);
dat2 := Trunc(DateTimePicker2.Date);
Datamodule2.Turb_Query2.Parameters.ParamByName('dat1').Value:= dat1;
Datamodule2.Turb_Query2.Parameters.ParamByName('dat2').Value:= dat2;

чтобы отбросить время в поле dt (если оно там есть, конечно), потребуется использовать специфику СУБД, к сожалению функции обработки дат отличаются в разных СУБД
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.05.2014, 14:34   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Если в dt есть время, то так (в параметр dat2 число на 1 больше, чем в DateTimePicker2.Date). dat1 и dat2 без времени. Это чуть помедленнее чем between
Код:
Where dt>=:dat1 AND dt<:dat2
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 07.05.2014, 15:26   #7
spotip
Пользователь
 
Регистрация: 09.06.2010
Сообщений: 68
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
абсолютно согласен.

причём время может мешать с двух сторон (как со стороны параметров, куда они попадают из DateTimePicker'ов, так и со стороны поля dt в БД).

я бы начал с того, что отбросил время в параметрах:
Код:
dat1 := Trunc(DateTimePicker1.Date);
dat2 := Trunc(DateTimePicker2.Date);
Datamodule2.Turb_Query2.Parameters.ParamByName('dat1').Value:= dat1;
Datamodule2.Turb_Query2.Parameters.ParamByName('dat2').Value:= dat2;

чтобы отбросить время в поле dt (если оно там есть, конечно), потребуется использовать специфику СУБД, к сожалению функции обработки дат отличаются в разных СУБД
если делаю так то выдаёт ошибку Parametr dat2 not found.
spotip вне форума Ответить с цитированием
Старый 07.05.2014, 15:26   #8
spotip
Пользователь
 
Регистрация: 09.06.2010
Сообщений: 68
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Если в dt есть время, то так (в параметр dat2 число на 1 больше, чем в DateTimePicker2.Date). dat1 и dat2 без времени. Это чуть помедленнее чем between
Код:
Where dt>=:dat1 AND dt<:dat2
если так то теперь 1 вое число показывает но не показывает 2 ое число
spotip вне форума Ответить с цитированием
Старый 07.05.2014, 15:31   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от spotip Посмотреть сообщение
если делаю так то выдаёт ошибку Parametr dat2 not found.
О! Как это может быть?!?!
У Вас в запросе есть:
Код:
Datamodule2.Turb_Query2.SQL.Add('Where dt between :dat1 and :dat2');
а в какой момент выдаётся ошибка (на какой строке кода)?


Цитата:
Сообщение от spotip Посмотреть сообщение
Цитата:
Сообщение от Аватар
Если в dt есть время, то так (в параметр dat2 число на 1 больше, чем в DateTimePicker2.Date). dat1 и dat2 без времени. Это чуть помедленнее чем between[CODE}Where dt>=at1 AND dt<at2[/CODE]
если так то теперь 1 вое число показывает но не показывает 2 ое число
Для такого подхода второй параметер (dat2) надо увеличить на 1 день.

Последний раз редактировалось Serge_Bliznykov; 07.05.2014 в 15:33.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.05.2014, 15:59   #10
spotip
Пользователь
 
Регистрация: 09.06.2010
Сообщений: 68
По умолчанию

[QUOTE=Serge_Bliznykov;1373507]О! Как это может быть?!?!
У Вас в запросе есть:
Код:
Datamodule2.Turb_Query2.SQL.Add('Where dt between :dat1 and :dat2');
а в какой момент выдаётся ошибка (на какой строке кода)?

Код:
var
dat1:TdateTime;
dat2:TdateTime;
begin
Datamodule2.Turb_Query1.Active:=false;
Datamodule2.Turb_Query1.SQL.Clear;
Datamodule2.Turb_Query1.SQL.Add('SELECT*');
Datamodule2.Turb_Query1.SQL.Add('FROM turb');
Datamodule2.Turb_Query1.SQL.Add('Where dt between :dat1 and :dat2'); 
dat1 := Trunc(DateTimePicker1.Date);
dat2 := Trunc(DateTimePicker2.Date);
Datamodule2.Turb_Query2.Parameters.ParamByName('dat1').Value:= dat1; -- тут ошибка Parametr dat1 not found
Datamodule2.Turb_Query2.Parameters.ParamByName('dat2').Value:= dat2;
Datamodule2.Turb_Query1.Active:=true;
spotip вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Быстрый поиск активных Ip адресов по диапазону IP Aliens_wolfs Работа с сетью в Delphi 4 25.04.2012 09:15
выборка из таблицы по диапазону дат strannick Microsoft Office Excel 4 12.12.2011 17:18
поиск значения ячейки по диапазону Othergirl Microsoft Office Excel 6 24.10.2011 17:30
Поиск по диапазону. D.O.G БД в Delphi 12 28.10.2010 10:17
Количество дней в месяце по диапазону дат VadimSh Microsoft Office Excel 6 26.11.2008 23:48