Сравнение дат через Sql запрос

  • Автор темы yuretz
  • Дата начала
Статус
Закрыто для дальнейших ответов.
Y

yuretz

#1
Доброго времени суток!

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

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

БД 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

В данном случае выскочит ошибка нессответствия типов данных, а как надо прописать, чтобы прошло сравнение?
 
Y

yuretz

#3
Пробовал кавычки, выдает "нессответствие типов данных в выражении условия отбора" :) оно и понятно, в общем-то, в кавычки обычно строковые переменные заключаются, а у меня поле DateTime

Других идей нет?
 
?

????

#4
Для: 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')).
 
S

Shurikanin

#5
Если ты создашь запрос с параметром и передашь туда дату как параметр все получится. Сам долго бился пока на нашел решение. Быть может есть и другой способ, но у меня получилось только так.
 
B

Barmutik

#6
Дата в MS Access представляется в виде числового значения... Поэтому следует передавать не текст а число. Просто перобразуйте в число и всё будет работать.
 
D

_dimka_

#7
а я собственную функцию замутил, как ??? говорил.
кстати как число тоже надо попробовать
 
M

Mistey

#8
BirDate имеет тип ДАТА? Если база Акцесовская, то все просто. Сначала дату надо привести в американскому стандарту. Можно воспользоваться в этом случае фунцией Format, но у меня так ничего не получилось, и писала функцию сама. Это во-первых. А во-вторых: в Access в SQL-запросах дату необходимо заключать в символы "решетка". В итоге должно получиться: #mm/dd/yyyy# :(

А вот базах dBase и FoxPro такая фишка не срабатывает. Так до сих пор там запрос по датам сделать не могу. Даже с помощью мастера. :)
 
M

Margo

#9
Приветствую!
Решила не создавать новую тему, а воспользоваться уже существующей. :lol:
У меня примерно таже проблема, но с тем условием что БД в 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)));

Надеюсь на скорый ответ.
 
M

Margo

#10
sax_ol
так и знала что будет подвох...

Параметры sql или delphi?
 
M

Margo

#11
sax_ol
мммм...
Мне необходимо найти кол-во изделий собранных за определённый период.
В таблице есть дата начала сборки и окончания.
Пользователь вводить свои две даты и они должны сравниваться с теми что в таблице...
 
M

Margo

#12
sax_ol
это границы того периода, за который он хочет увидеть количество собранных изделий
 
M

Margo

#14
ммм... ложила... Вот что у меня получалось

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

Но запись явно не верна
 
M

Margo

#15
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;

ммм...
 
M

Margo

#16
sax_ol
Оно работает!
Ну наконец-то ))
Спасибо огромное))

далее надо исправить SELECT. И поэтому вопрос, кто посоветовал DISTINCT тут? зачем он тут?
Ну, в принципе, он не должен сильно влиять на результат. Хотя можно заменить на *.
а посоветовали преподаватели... )
 
B
#17
Доброго времени суток!!!

У меня схожая ситуация, делая по вашему примеру
Получается так
Имеется база данных в Аксесс соединяю через ADO
Нужно произвести выборку по Дате и по Специальности
Вводим специальность и диапозон даты в котором должна произвестись выборка
текст такой
SQL.Add('SELECT №,Data,№_computer,Family,SPEC,Group,Vypol');
SQL.Add('FROM Таблица1');
SQL.Add('WHERE');
SQL.Add('SPEC = ("' + fam + '")');
SQL.Add ( 'Data >= :nqTime0 AND Data <= :nqTime1 ');
ADOQuery1.Parameters.ParamByName('nqTime0 ').Value:=DateTimePicker1.Date ;
ADOQuery1.Parameters.ParamByName('nqTime1 ').Value:=DateTimePicker2.Date ;


fam-введенная специальность
Дата вводиться через DateTimePicker1.Date?DateTimePicker2.Date


Ошибка выходит: ADOQuery1: Parametr 'nqTimer0' not found

Если сможете помогите разобратся! Буду очень признателен...
 
Статус
Закрыто для дальнейших ответов.