Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите составить запрос 
:(
    Опции темы
ALEXPLUS
Дата 8.7.2005, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 8.7.2005
Где: Солнечный Узбекис тан

Репутация: нет
Всего: нет



Доброе время суток всем!
Помогите пожалуйста составить запрос. Есть база данных, в которой дата содержится в трёх полях - Day, Month, Year. Как сделать написать запрос так, чтобы он выбирал записи только в заданном диапазоне даты?
PM MAIL ICQ   Вверх
Alex
Дата 8.7.2005, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 17
Всего: 162



А в типе Date не проще хранить? Тогда было бы что-то на подобии
Код

where k.datezakl BETWEEN :speriod and :fperiod



--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
ALEXPLUS
Дата 8.7.2005, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 8.7.2005
Где: Солнечный Узбекис тан

Репутация: нет
Всего: нет



Я бы с огромным удовольствием переделал это в тип Date, но, к сожалению, нельзя smile
PM MAIL ICQ   Вверх
Alex
Дата 8.7.2005, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 17
Всего: 162



Ну тогда, делай вот так:
Код

WHERE ((p.god*1000) + (p.mes*100) + p.day) BETWEEN ((:ngod_param*1000) + (:nmes_param*100) + :nday_param) and ((:fgod_param*1000) + (:fmes_param*100) + :nday_param)



--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
ALEXPLUS
Дата 8.7.2005, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 8.7.2005
Где: Солнечный Узбекис тан

Репутация: нет
Всего: нет



Извини, но я не понял. Прокомментируй пожалуйста свой код. Почему ты умножаешь на 1000, 100?
PM MAIL ICQ   Вверх
offline
Дата 9.7.2005, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 474
Регистрация: 7.2.2005

Репутация: 7
Всего: 7



Для сбора даты в одно пле в запросе используй просто DateSerial(Year;Month;Day), а затем сравнивай эту дату, т.е. установи критерий отбора, вот и все дела
PM MAIL   Вверх
Alex
Дата 9.7.2005, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 17
Всего: 162



Идея состоит в том, что из трех чисел (год, месяц и день) получают одно большое число. из начальной и конечной даты выборки получают такиеже два больших числа и проверяют входит ли число в диапазон между этими числами.

Я не притендую на то, что этот метод самый красивый и правильный, но в одном проекте такая схема работает уже второй год и пока сбоев не давала
Добавлено @ 00:05
Ой, немного ошибся, нужно вот так
Код

WHERE ((p.god*10000) + (p.mes*100) + p.day) BETWEEN ((:ngod_param*10000) + (:nmes_param*100) + :nday_param) and ((:fgod_param*10000) + (:fmes_param*100) + :nday_param)

Добавлено @ 00:07
kirilllius, и где кроме Access вы видели DateSerial?


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
offline
Дата 9.7.2005, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 474
Регистрация: 7.2.2005

Репутация: 7
Всего: 7



Да, я делал как-то что-то похожее с базай Access но правда через DateValue(Day+'/'+Month+'/'+Year) и все работало отлично

PM MAIL   Вверх
ALEXPLUS
Дата 9.7.2005, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 8.7.2005
Где: Солнечный Узбекис тан

Репутация: нет
Всего: нет



Код

SELECT * FROM DbData WHERE (IDR='5') AND (DateValue('DayP/MonthP/YearP') BETWEEN '05/07/2005' AND '09/07/2005')


Скажите, где тут ошибка?? smile
Говорит, что "Несоответствие типов данных в выражении условия отбора".
Все поля в БД текстового типа. Сама база была сделана через Access
PM MAIL ICQ   Вверх
offline
Дата 9.7.2005, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 474
Регистрация: 7.2.2005

Репутация: 7
Всего: 7



DateValue('DayP/MonthP/YearP')
Может так DateValue(DayP+'/'+MonthP+'/'+YearP)
PM MAIL   Вверх
ALEXPLUS
Дата 9.7.2005, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 8.7.2005
Где: Солнечный Узбекис тан

Репутация: нет
Всего: нет



DateValue(DayP+'/'+MonthP+'/'+YearP)
не получается. smile Delphi в таком случае DayP, MonthP, YearP понимает как переменные и, соответственно говорит "нету таких переменных". DayP, MonthP, YearP - поля в моей базе, где соответственно хранятся день, месяц и год

Это сообщение отредактировал(а) ALEXPLUS - 9.7.2005, 20:23
PM MAIL ICQ   Вверх
offline
Дата 9.7.2005, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 474
Регистрация: 7.2.2005

Репутация: 7
Всего: 7



Сейчас создал базу, подключил к Delphi и выполнил запрос

Код

SELECT * FROM Таблица1
WHERE (IDR='5') AND (DateValue(DayP+'/'+MonthP+'/'+YearP) Between '05/07/2005' And '09/07/2005')


У меня все сработало и отобрало из данного промежутка даты
PM MAIL   Вверх
ALEXPLUS
Дата 9.7.2005, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 8.7.2005
Где: Солнечный Узбекис тан

Репутация: нет
Всего: нет



smile smile smile НЕ ПОЛУЧАЕТСЯ.
Я делаю так
TADOQuery связываю с TADOConnection
Драйвер - Microsoft.Jet.OLEDB.4.0

Код

Query.SQL.Clear;
sql:='SELECT * FROM DbData WHERE (IDR='+k+IntToStr(i)+k+') 
AND (DateValue('+k+'DayP/MonthP/YearP'+k+')
BETWEEN '+k+DateToString(DateTimePicker1.Date)+k+' AND '+k+DateToString(DateTimePicker2.Date)+k+')';
Query.SQL.Add(sql);
Query.Open;



переменная k - типа string и равна символу одинарная кавычка. Просто так удобней
переменная sql - текстовая
PM MAIL ICQ   Вверх
offline
Дата 9.7.2005, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 474
Регистрация: 7.2.2005

Репутация: 7
Всего: 7



Может это наведет тебя на мысль

Код

ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * FROM DbData');
ADOQuery1.SQL.Add('WHERE (IDR='+QuotedStr(IntToStr(i))+')');
ADOQuery1.SQL.Add('AND (DateValue(DayP +''/''+ MonthP+''/''+YearP)' );
ADOQuery1.SQL.Add('BETWEEN '+ QuotedStr(DateToStr(DateTimePicker2.Date)));
ADOQuery1.SQL.Add('AND '+ QuotedStr(DateToStr(DateTimePicker2.Date))+')');
ADOQuery1.Open;

PM MAIL   Вверх
ALEXPLUS
Дата 9.7.2005, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 8.7.2005
Где: Солнечный Узбекис тан

Репутация: нет
Всего: нет



полоностью скопировал твой запрос, но результат тот же - несоответствие типов.
Я разобрался немного с DateValue. Этой функции без разницы как я напишу дату. Она понимает и 09/07/2005,
и 09.07.2005, и 09-07-2005. Вся проблема состоит в том, чтобы представить в качестве параметра этой функции три текстовых поля из БД.
Если тебе несложно, пришли мне на почту свою базу данных и дельфийский проект. Если будешь посылать, то шли на alexplyus [собака] mail.ru
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.1155 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.