|
Вопрос # 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_date
- FROM 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_date
- FROM employee
- WHERE '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]:
вот так всё работает
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|