• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

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

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

yuretz

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

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

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

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

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

Guest

Наверное дату в кавычки нужно заключить
 
Y

yuretz

Пробовал кавычки, выдает "нессответствие типов данных в выражении условия отбора" :) оно и понятно, в общем-то, в кавычки обычно строковые переменные заключаются, а у меня поле 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')).
 
S

Shurikanin

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

Barmutik

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

_dimka_

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

Mistey

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

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

Margo

Приветствую!
Решила не создавать новую тему, а воспользоваться уже существующей. :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

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

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

Margo

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

Margo

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

Margo

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

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

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

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;

ммм...
 
M

Margo

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

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

BKK

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

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

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!