ОБСУЖДЕНИЕ

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

16 ответов 43,8 тыс.
AI-выжимка обсуждения скоро

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

Статус
Закрыто для дальнейших ответов.
Автор темы
Доброго времени суток!

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

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

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

В данном случае выскочит ошибка нессответствия типов данных, а как надо прописать, чтобы прошло сравнение?
 
Наверное дату в кавычки нужно заключить
 
Пробовал кавычки, выдает "нессответствие типов данных в выражении условия отбора" :) оно и понятно, в общем-то, в кавычки обычно строковые переменные заключаются, а у меня поле 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')).
 
Если ты создашь запрос с параметром и передашь туда дату как параметр все получится. Сам долго бился пока на нашел решение. Быть может есть и другой способ, но у меня получилось только так.
 
Дата в MS Access представляется в виде числового значения... Поэтому следует передавать не текст а число. Просто перобразуйте в число и всё будет работать.
 
а я собственную функцию замутил, как ??? говорил.
кстати как число тоже надо попробовать
 
BirDate имеет тип ДАТА? Если база Акцесовская, то все просто. Сначала дату надо привести в американскому стандарту. Можно воспользоваться в этом случае фунцией Format, но у меня так ничего не получилось, и писала функцию сама. Это во-первых. А во-вторых: в Access в SQL-запросах дату необходимо заключать в символы "решетка". В итоге должно получиться: #mm/dd/yyyy# :(

А вот базах dBase и FoxPro такая фишка не срабатывает. Так до сих пор там запрос по датам сделать не могу. Даже с помощью мастера. :)
 
Приветствую!
Решила не создавать новую тему, а воспользоваться уже существующей. :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)));

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

Параметры sql или delphi?
 
sax_ol
мммм...
Мне необходимо найти кол-во изделий собранных за определённый период.
В таблице есть дата начала сборки и окончания.
Пользователь вводить свои две даты и они должны сравниваться с теми что в таблице...
 
sax_ol
это границы того периода, за который он хочет увидеть количество собранных изделий
 
sax_ol
Да, верно.
 
ммм... ложила... Вот что у меня получалось

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

Но запись явно не верна
 
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
Оно работает!
Ну наконец-то ))
Спасибо огромное))

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

У меня схожая ситуация, делая по вашему примеру
Получается так
Имеется база данных в Аксесс соединяю через 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

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