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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.11.2018, 03:52   #1
Zoomer123
Пользователь
 
Регистрация: 19.01.2012
Сообщений: 33
По умолчанию Выборка по БД через SQL запрос

И так, друзья мои)

Имеется у нас программка с компонентом DBGrid и подключенной базой данных ADOQuery

Файл *.mdb я использовал в качестве базы.

В базе имеется несколько столбцов, один из них - типом дата/время, один - текст, все остальные - числовые.

В базу прекрасно добавляются и удаляются записи, делается прекрасная выборка по всем параметрам кроме одного...

Это столбец даты. По нему не проходит ни один SQL запрос.
Как я только не изголялся над этой проблемой - решения нет(

Снизу прикрутил Edit и Button для быстрого исполнения SQL кода

Код батона

Код:
ADOQuery1.Active:=false;
ADOQuery1.SQL.Clear;
Form2.ADOQuery1.SQL.Text:=Edit1.Text;
ADOQuery1.Active:=true;
Screenshot_1.jpg

Screenshot_2.jpg

Screenshot_3.jpg

При этом сортировка по дате проходит на ура:

Код:
ADOQuery1.Active:=false;
ADOQuery1.SQL.Clear;
adoquery1.SQL.Text:='SELECT * FROM К1 ORDER BY [Дата путевки]';
ADOQuery1.Active:=true;
Тот же самый момент в Access:

Screenshot_4.jpg

Другой SQL код уже не ругается на синтаксис, но ругается на несоответствие типов данных

Screenshot_6.jpg

Хотя тип данных - дата/время!

Screenshot_5.jpg

Выкладываю весь проект со всеми потрохами. Замудохался я что-то за последние 3 дня...

http://zalil.su/1520419

Что делать, господа?

Последний раз редактировалось Zoomer123; 28.11.2018 в 08:07.
Zoomer123 вне форума Ответить с цитированием
Старый 28.11.2018, 08:48   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

А так:
Код:
[Дата путевки] BETWEEN #03.02.2016# AND #31.07.2018#
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 28.11.2018, 09:37   #3
Zoomer123
Пользователь
 
Регистрация: 19.01.2012
Сообщений: 33
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А так:
Код:
[Дата путевки] BETWEEN #03.02.2016# AND #31.07.2018#
Аналогично

Screenshot_7.jpg

Screenshot_8.jpg
Zoomer123 вне форума Ответить с цитированием
Старый 28.11.2018, 09:45   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Так еще попробуй, месяц там вроде первый должен быть
Код:
[Дата путевки] BETWEEN #02/15/2016# AND #07/31/2018#
А вообще лучше параметризировать запрос и не париться с форматом даты в запросе, с этим вечные проблемы для разных СУБД
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 28.11.2018, 09:46   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

ну и добавлю (хотя совет Аватар для mdb скорее всего сработает)
для работы с полями типа дата/время крайне рекомендуется использовать параметрические запросы (запросы с параметром) (легко найти поиском примеры даже на этом же форуме).
Это исключит все возможные косяки с локальным представлением даты/времени: разделителем, порядком представления в дате дня/месяца/года и т.д.
Передавать дату в качестве строки - это крайне опасная идея.

если использовать формат ##, то пишут, что
Цитата:
В Джет, формат даты #mm/dd/yyyy# вне зависимости от того, какие рег.параметры на клиенте.
хотя я бы всё равно использовать параметры!

Последний раз редактировалось Serge_Bliznykov; 28.11.2018 в 09:50.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.11.2018, 10:09   #6
Zoomer123
Пользователь
 
Регистрация: 19.01.2012
Сообщений: 33
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Так еще попробуй, месяц там вроде первый должен быть
Код:
[Дата путевки] BETWEEN #02/15/2016# AND #07/31/2018#
А вообще лучше параметризировать запрос и не париться с форматом даты в запросе, с этим вечные проблемы для разных СУБД
Скажите, где вам памятник поставить?)

Спасибо, все, что надо, заработало)

Буду кроптеть дальше)
Zoomer123 вне форума Ответить с цитированием
Старый 28.11.2018, 10:10   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
Скажите, где вам памятник поставить?)
Еще рано ставить. Как только, так и скажу сразу ))
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 28.11.2018, 10:12   #8
Zoomer123
Пользователь
 
Регистрация: 19.01.2012
Сообщений: 33
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Еще рано ставить. Как только, так и скажу сразу ))
Еще раз благодарю)

И еще один запрос в догонку -

Цитата:
А вообще лучше параметризировать
Это как?)
Zoomer123 вне форума Ответить с цитированием
Старый 28.11.2018, 10:20   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

По простому примерно так:
Код:
AdoQuery.SQL.Text:='SELECT * FROM Таблица WHERE [Дата путевки] BETWEEN :DateFrom  AND :DateTo';
AdoQuery.Parameters.ParamByName('DateFrom').Value:=Date1; //Date1 - TDateTime
AdoQuery.Parameters.ParamByName('DateTo').Value:=Date2;
AdoQuery.Open;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 28.11.2018 в 10:28.
Аватар вне форума Ответить с цитированием
Старый 28.11.2018, 13:00   #10
Zoomer123
Пользователь
 
Регистрация: 19.01.2012
Сообщений: 33
По умолчанию

Ребят, еще вопрос. Как теперь сформировать выборку по Автомобилям в указанный переиод?

По отдельности все получается, но как соединить их в один SQL запрос?

Код:
Select * from к1 where [Дата путевки] BETWEEN #02/15/2016# AND #07/31/2018#
Код:
select * from к1 where [Автомобиль]='н012ао97 Audi 80 9
UPD:

Допетрил, нужно между запросами добавить UNION

запрос 1 UNION запрос 2

И все это в одну строку

Последний раз редактировалось Zoomer123; 28.11.2018 в 13:18.
Zoomer123 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
sql запрос. выборка из бд Assmay Помощь студентам 2 15.02.2016 14:56
Создать программу через SQL-запрос willii БД в Delphi 22 08.10.2014 00:27
Поиск по дате с через SQL запрос betirsolt БД в Delphi 6 25.05.2013 20:42
sql запрос через Query Lokos БД в Delphi 21 03.03.2010 14:38
Создание новых таблиц в MS SQL SERVERE через SQL запрос в Delphi S_Yevgeniy Помощь студентам 1 27.10.2009 06:26