| 
| 
 | Вопрос # 1 632/ вопрос открыт / | 
 |  Здравствуйте!Подскажите пожалуйста, как можно произвести выборку (с помощью SQL) по полю формата даты?
 
|  |   Вопрос задала: Emma (статус: Посетитель)Вопрос отправлен: 29 мая 2008, 11:43
 Состояние вопроса: открыт, ответов: 2.
 |  Ответ #1. Отвечает эксперт: Feniks Здравствуйте, Emma!Смотрите в Приложении выдержку из одной статьи по SQL...
 Желаю удачи...
 Приложение:Переключить в обычный режим    ♦	       "October 27, 1995"♦	       "27-OCT-1994"♦	       "10-27-95"♦	       "10/27/95"♦	       "27.10.95"          SELECT first_name, last_name, hire_dateFROM employee    FIRST_NAME      LAST_NAME              HIRE_DATE =============== ==================== =========== Pierre          Osborne               3-JAN-1994 John            Montgomery           30-MAR-1994 Mark            Guckenheimer          2-MAY-1994    SELECT first_name, last_name, hire_dateFROM employeeWHERE 'today' - hire_date > 365 * 7 + 1     FIRST_NAME      LAST_NAME              HIRE_DATE =============== ==================== =========== Robert          Nelson               28-DEC-1988 Bruce           Young                28-DEC-1988
|  | Ответ отправил: Feniks (статус: Бакалавр)Время отправки: 29 мая 2008, 15:43
 Оценка за ответ: 5
 |  Ответ #2. Отвечает эксперт: Вадим К Здравствуйте, Emma!В каждой СУБД реализован свой метод по передачи даты. Учитывая предыдущий Ваш вопрос, предположу, что этот вопрос будет в плоскости BDE. В данном случае наиболее лучше использовать запросы с параметрами. Пример есть здесь.
 Но я бы не рекомендовал заниматься изучением BDE - он считается морально устаревшим и не поддерживается с 1999 года. Как наиболее близкая замена - ADO+Access. В нём, что бы записать дату/время, надо писать её в таком формате
 Const JetDateTimeFmt = '#mm/dd/yyyy hh:nn:ss#'
 Const JetDateFmt = '#mm/dd/yyyy#'
 Const JetTimeFmt = '#hh:nn:ss#'
 Например,
 
 SELECT first_name, last_name, hire_date
 FROM employee
 WHERE hire_date > #01/01/1994#
 (замечу - вначале месяц!)
 
|  | Ответ отправил: Вадим К (статус: Академик)Время отправки: 30 мая 2008, 01:31
 
 |  
 Мини-форум вопросаВсего сообщений: 10; последнее сообщение — 12 июня 2008, 22:36; участников в обсуждении: 2. 
|   | Emma (статус: Посетитель), 30 мая 2008, 14:02 [#1]:Сделала по совету Fenix: SELECT first_name, last_name, hire_date
 FROM employee
 WHERE hire_date > '1-1-94'   ... Все работает без проблем.
 Но теперь, как верно заметил Вадим К, надо применять параметры, чтоб не лезть в код для замены значений даты.
 Возникла новая проблема: как я понимаю, дату можно вводить только в DateTimePicker. Как ее в качестве параметра принять можно? В переменную какого типа записывать?
 |  
|   | Вадим К (статус: Академик), 30 мая 2008, 21:00 [#2]:для даты есть тип TDate (как не странно  ). для времени - TTime. Также есть "совместный" формат - TDateTime. Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Emma (статус: Посетитель), 30 мая 2008, 23:34 [#3]:про тип TData я, как ни странно, подумала, НО глянула я статью про параметры, что вы рекомендовали, там такая процедура: procedure TForm1.Edit1Change(Sender: TObject);
 var temp, rez: integer;
 begin
 val (Edit1.Text, rez, temp);
 Query1.ParamByName('min').Value := rez;
 Query1.Open;
 end;
 Строка " val (Edit1.Text, rez, temp) " - это преобразование в число. А в моем случае как? Я пыталась просто в переменную (tdate) записать значение DataTimePicker, но он мне несовместимость типов выдает
   |  
|   | Вадим К (статус: Академик), 31 мая 2008, 03:01 [#4]:ну если бы вы написали, как вы записать пытаетесь... Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Emma (статус: Посетитель), 1 июня 2008, 00:17 [#5]:Вобщем в обработчик события вставила: procedure TForm3.DateTimePicker1Change(Sender: TObject);
 begin
 Query1.ParamByName('min').Value:=DateTimePicker1.Date;
 Query1.Open;
 end;
 
 procedure TForm3.DateTimePicker2Change(Sender: TObject);
 begin
 Query1.Active := false;
 Query1.ParamByName('max').Value :=DateTimePicker2.Date;
 Query1.Open;
 end;
 
 Сам запрос выглядит следующим образом:
 with Query1 do
 begin
 Active:=false;
 SQL.Clear;
 SQL.Add('select BD_PO."dat", BD_PO.stat, codcount, codt, curcod, BD_PO."sum" from BD_PO where BD_PO.stat="nerez" or BD_PO.stat="rez" and BD_PO."dat" between :min and :max');
 Active:=true;
 end;
 |  
|   | Emma (статус: Посетитель), 1 июня 2008, 00:19 [#6]:Параметры min/max типа Tdate. При запуске выдает ошибку: "Field 'min' is of an unknown type" |  
|   | Вадим К (статус: Академик), 1 июня 2008, 17:06 [#7]:Ну так кто мешает указать тип? но есть и другое - у вашего запроса два параметра. А вы указываете один, после чего открываете запрос. А так нельзя.
 во вторых, open и active = true - абсолютно идентичные вещи.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Emma (статус: Посетитель), 1 июня 2008, 22:13 [#8]:Признаться честно, пока не въезжаю, о чем речь, но постараюсь разобраться ))) Спасибо за помощь! |  
|   | Emma (статус: Посетитель), 12 июня 2008, 22:36 [#9]:Active:=false; SQL.Clear;
 SQL.Add('Select codt, codcount, curcod from BD_PO where (BD_PO."dat" between :min and :max);
 Params.ParseSQL(Query1.SQL.text, true);
 Params.ParamByName('min').AsDate:=DateTimePicker1.Date;
 Params.ParamByName('max').AsDate:=DateTimePicker2.Date;
 Active:=True
 |  
|   | Emma (статус: Посетитель), 12 июня 2008, 22:36 [#10]:вот так всё работает |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |