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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.03.2012, 13:24   #1
Cyworc
 
Регистрация: 22.10.2008
Сообщений: 8
Восклицание Сравнение дат MySQL

Добрый день профи. Разрабатываю программу с использованием БД MySQL, возникла необходимость выводить диапазон записей между двумя датами. Поглядел в интернете примеры, но ни один не работает корректно в моем случае.

И так, имеем таблицу, в которой хранятся записи и дата в поле "act_date", тип данных "date".

В Delphi, пишу команду:

Код:
procedure TFinanceForm.Button1Click(Sender: TObject);
begin
  SimpleDataSet1.Active:=False;
  SimpleDataSet1.DataSet.Active:=False;
  SimpleDataSet1.DataSet.CommandType:=ctQuery;
  SimpleDataSet1.DataSet.CommandText:='SELECT * FROM formc WHERE act_date BETWEEN'+#39+MaskEdit1.Text+#39+' AND '+#39+MaskEdit1.Text+#39;
  SimpleDataSet1.Active:=True;
  SimpleDataSet1.DataSet.Active:=True;
end;
При использовании подобного варианта, он выводит лишь одну запись, ту, дата которой равняется значению в MaskEdit1, и игнорирует все остальное.

Пробовал так же, вместо BETWEEN AND использовать конструкцию с "act_date >= <=", тут вообще никакой реакции, ни ошибки, ни выборки не происходит.

Где я ошибаюсь, подскажите пожалуйста, очень важно
Cyworc вне форума Ответить с цитированием
Старый 04.03.2012, 13:45   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Во-первых после BETWEEN не мешало бы пробел засунуть
Во-вторых попробуйте параметризированный запрос
Не в курсе тип date MySQL время содержит? Если содержит, то конец диапазона нужно на единицу увеличить
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 04.03.2012, 13:47   #3
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

MySQL всегда читает дату в формате YYYY-MM-DD.
Поэтому подставлять дату как текст весьма опасно. Может выдать совершенно не те записи, которые нужно. Лучше всего делать запрос с параметрами
Код:
 
var FDateBegin, FDateEnd: TDateTime;
//*************************
with Query1 do
  begin
  Close;
  SQL.Text := 'SELECT * FROM your_table ' +
                        'WHERE date BETWEEN :date_begin AND :date_end;';
  ParamByName('date_begin').AsDateTime := FDateBegin;
  ParamByName('date_end').AsDateTime := FDateEnd;
  Open;
  end;
Цитата:
выводит лишь одну запись, ту, дата которой равняется значению в MaskEdit1
Хм... MaskEdit1.Text равно MaskEdit1.Text. Какой здесь может быть BETWEEN?
_SERGEYX_ вне форума Ответить с цитированием
Старый 04.03.2012, 14:52   #4
Cyworc
 
Регистрация: 22.10.2008
Сообщений: 8
По умолчанию

Цитата:
Хм... MaskEdit1.Text равно MaskEdit1.Text. Какой здесь может быть BETWEEN?
Это просто опечатка была )

Цитата:
MySQL всегда читает дату в формате YYYY-MM-DD.
Поэтому подставлять дату как текст весьма опасно. Может выдать совершенно не те записи, которые нужно. Лучше всего делать запрос с параметрами
А вот за это спасибо! Можно закрепить тему, закрыть или удалить, спасибо за столь быструю помощь
Cyworc вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сравнение дат! RSmile БД в Delphi 0 28.04.2010 20:40
сравнение дат Алёна Microsoft Office Excel 8 03.07.2009 10:47
C#: Сравнение дат Veiron Общие вопросы .NET 1 08.06.2009 23:32
Сравнение дат for_regist1 БД в Delphi 21 26.01.2009 01:29
сравнение дат Geddar Общие вопросы Delphi 2 04.06.2008 19:09