Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Сравнение дат через Sql запрос
Форум программистов > Системное программирование > Delphi и Pascal > Delphi - Базы данных
yuretz
Доброго времени суток!

Сразу оговорюсь, за программирование БД взялся недавно, поэтому просьба ногами не бить smile.gif

Есть такая проблемка:

БД MSAccess (*.mdb), доступ до нее из delphi через ADO.

Подскажите пожалуйста текст SQL запроса для выборки по датам (больше, меньше, равна)

вот фрагментик кода, что в нем нужно поправить:

FizFind.Active:=false;
FizFind.SQL.Clear;
FizFind.SQL.Add('Select * from table');
FizFind.sql.Add('WHERE');
if FindDate.Text<>'' then FizFind.SQL.Add('BirDate = '+FindDate.Text);
FizFind.active:=true;

сдесь FizFind - ADQQuery, FindDate - коомпонент TEdit, откуда берется значение для сравнения; BirDate - поле в таблице типа DateTime

В данном случае выскочит ошибка нессответствия типов данных, а как надо прописать, чтобы прошло сравнение?
Guest
Наверное дату в кавычки нужно заключить
yuretz
Пробовал кавычки, выдает "нессответствие типов данных в выражении условия отбора" sad.gif оно и понятно, в общем-то, в кавычки обычно строковые переменные заключаются, а у меня поле DateTime

Других идей нет?
????
Для: yuretz
пробуй выполнять запрос без "подстановки", т.е. сразу
 FizFind.SQL.Add('Select * from table where BirDate = 01/01/2001');

если формат даты соответствует (т.е. ДД/ММ/ГГГГ), то всё должно быть ОК, если нет - меняй формат на ДД-ММ-ГГГГ. А ещё попродуй дату "окружить" в диезы
 FizFind.SQL.Add('Select * from table where BirDate = #01/01/2001#');

где-то я такое встречал. Можно поискать функции явного преобразования к дате (что-то типа TO_DATE('1/1/1')).
Shurikanin
Если ты создашь запрос с параметром и передашь туда дату как параметр все получится. Сам долго бился пока на нашел решение. Быть может есть и другой способ, но у меня получилось только так.
Barmutik
Дата в MS Access представляется в виде числового значения... Поэтому следует передавать не текст а число. Просто перобразуйте в число и всё будет работать.
_dimka_
а я собственную функцию замутил, как ??? говорил.
кстати как число тоже надо попробовать
Mistey
BirDate имеет тип ДАТА? Если база Акцесовская, то все просто. Сначала дату надо привести в американскому стандарту. Можно воспользоваться в этом случае фунцией Format, но у меня так ничего не получилось, и писала функцию сама. Это во-первых. А во-вторых: в Access в SQL-запросах дату необходимо заключать в символы "решетка". В итоге должно получиться: #mm/dd/yyyy# cool.gif

А вот базах dBase и FoxPro такая фишка не срабатывает. Так до сих пор там запрос по датам сделать не могу. Даже с помощью мастера. sad.gif
Margo
Приветствую!
Решила не создавать новую тему, а воспользоваться уже существующей. smile.gif
У меня примерно таже проблема, но с тем условием что БД в MSSQL.
Как организовать сравнение дат через запрос?
Дату которую нужно сравнивать с табличной вводит юзер. (это параметры InqTime0 и InqTime1)

ADOQuery1.SQL.Add('SELECT Count(DISTINCT [№_изделия]) AS Count ');
ADOQuery1.SQL.Add('FROM Изделия ');
ADOQuery1.SQL.Add(WHERE 'Время_начала_сборки BETWEEN');
ADOQuery1.SQL.Add(QuotedStr(FormatDateTime('dd/mm/yyyy',InqTime0))+' AND');
ADOQuery1.SQL.Add(QuotedStr(FormatDateTime('dd/mm/yyyy',InqTime1)));
ADOQuery1.SQL.Add(' AND Время_окончания_сборки BETWEEN');
ADOQuery1.SQL.Add(QuotedStr(FormatDateTime('dd/mm/yyyy',InqTime0))+' AND');
ADOQuery1.SQL.Add(QuotedStr(FormatDateTime('dd/mm/yyyy',InqTime1)));

Надеюсь на скорый ответ.
sax_ol
Margo Тут все неправльно, и главное - надо использовать параметры.
Margo
sax_ol
так и знала что будет подвох...

Параметры sql или delphi?
sax_ol
Цитата(Margo @ 14:06:2008 - 10:07) *
Параметры sql или delphi?
Э ... ну в таком выражении, тогда - delphi. Хотя это не совсем правильно, но если вам так удобнее...
Какую проблему решаете?
Margo
sax_ol
мммм...
Мне необходимо найти кол-во изделий собранных за определённый период.
В таблице есть дата начала сборки и окончания.
Пользователь вводить свои две даты и они должны сравниваться с теми что в таблице...
sax_ol
Цитата(Margo @ 14:06:2008 - 10:23) *
Пользователь вводить свои две даты
А какой смысл этих дат?
Margo
sax_ol
это границы того периода, за который он хочет увидеть количество собранных изделий
sax_ol
Ну тогда давайте "по шагам". Надо так :
Время_начала_сборки должна быть больше или равна InqTime0
и Время_окончания_сборки должна быть меньше или равна InqTime1
?
Margo
sax_ol
Да, верно.
sax_ol
Теперь попробуйте это положить на язык SQL.
Margo
ммм... ложила... Вот что у меня получалось

ADOQuery1.SQL.Text := 'SELECT Count(DISTINCT [№_изделия]) AS Count FROM Изделия WHERE Изделия.Время_начала_сборки >= ''%'+InqTime0+'%'' AND Изделия.Время_окончания_сборки <= ''%'+InqTime1+'%'';';

Но запись явно не верна
sax_ol
Пока разбираем секцию WHERE до SELECT еще дойдем smile.gif... зачем тут вставили - % ? и опять же - параметры!
Margo
sax_ol
хорошо)
эммм... параметры..

ADOQuery1.SQL.Add('Время_начала_сбоки >=');
ADOQuery1.SQL.ADD(':Q');
ADOQuery1.Parameters.ParamByName('Q').Value:= InqTime0;
ADOQuery1.SQL.Add('Время_окончания_сборки <=');
ADOQuery1.SQL.ADD(':Q1');
ADOQuery1.Parameters.ParamByName('Q1').Value:= InqTime1;

ммм...
sax_ol
ну вот уже лучше, только хачем такие выкрутасы с SQL.Add? просто все в 1 строку, она у вас пока не такая и большая, а параметры можно инициализировать в самом конце они от этого не пострадают

т.е. сейчас имеем
ADOQuery1.SQL.Text := 'SELECT Count(DISTINCT [№_изделия]) AS Count FROM Изделия WHERE Время_начала_сборки >= :InqTime0 AND Время_окончания_сборки <= :InqTime1';
ADOQuery1.Parameters.ParamByName('InqTime0').Value:= InqTime0;
ADOQuery1.Parameters.ParamByName('InqTime1').Value:= InqTime1;

далее надо исправить SELECT. И поэтому вопрос, кто посоветовал DISTINCT тут? зачем он тут?
Margo
sax_ol
Оно работает!
Ну наконец-то ))
Спасибо огромное))

Цитата(sax_ol @ 14:06:2008 - 10:20) *
далее надо исправить SELECT. И поэтому вопрос, кто посоветовал DISTINCT тут? зачем он тут?

Ну, в принципе, он не должен сильно влиять на результат. Хотя можно заменить на *.
а посоветовали преподаватели... )
sax_ol
Цитата(Margo @ 14:06:2008 - 11:35) *
Оно работает!
Естественно, когда правильно тогда и все проще и работает. smile.gif
Цитата(Margo @ 14:06:2008 - 11:35) *
Ну, в принципе, он не должен сильно влиять на результат
Дело не во влиянии, а в правильности. Удачи.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2008 IPS, Inc.