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

Тема в разделе "Delphi - Базы данных", создана пользователем yuretz, 12 июл 2005.

Статус темы:
Закрыта.
  1. yuretz

    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

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

    Guest Гость

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

    yuretz Гость

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

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

    ???? Гость

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

    Shurikanin Гость

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

    Barmutik Гость

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

    _dimka_ Гость

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

    Mistey Гость

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

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

    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)));

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

    Margo Гость

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

    Параметры sql или delphi?
     
  11. Margo

    Margo Гость

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

    Margo Гость

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

    Margo Гость

    sax_ol
    Да, верно.
     
  14. Margo

    Margo Гость

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

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

    Но запись явно не верна
     
  15. Margo

    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;

    ммм...
     
  16. Margo

    Margo Гость

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

    Ну, в принципе, он не должен сильно влиять на результат. Хотя можно заменить на *.
    а посоветовали преподаватели... )
     
  17. BKK

    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

    Если сможете помогите разобратся! Буду очень признателен...
     
Загрузка...
Похожие Темы - Сравнение дат через
  1. k85
    Ответов:
    2
    Просмотров:
    1.152
  2. juk-777
    Ответов:
    29
    Просмотров:
    4.706
  3. Реник
    Ответов:
    0
    Просмотров:
    1.083
  4. alb
    Ответов:
    36
    Просмотров:
    10.682
  5. Erlan
    Ответов:
    8
    Просмотров:
    1.641
Статус темы:
Закрыта.

Поделиться этой страницей