Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 632

/ вопрос открыт /

Здравствуйте!
Подскажите пожалуйста, как можно произвести выборку (с помощью SQL) по полю формата даты?

Emma Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задала: Emma (статус: Посетитель)
Вопрос отправлен: 29 мая 2008, 11:43
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Feniks

Здравствуйте, Emma!
Смотрите в Приложении выдержку из одной статьи по SQL...
Желаю удачи...

Приложение:
  1.  
  2.  
  3.  
  4. ♦ "October 27, 1995"
  5. ♦ "27-OCT-1994"
  6. ♦ "10-27-95"
  7. ♦ "10/27/95"
  8. ♦ "27.10.95"
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.  
  16.  
  17.  
  18.  
  19. SELECT first_name, last_name, hire_date
  20. FROM employee
  21.  
  22.  
  23.  
  24.  
  25. FIRST_NAME LAST_NAME HIRE_DATE
  26. =============== ==================== ===========
  27. Pierre Osborne 3-JAN-1994
  28. John Montgomery 30-MAR-1994
  29. Mark Guckenheimer 2-MAY-1994
  30.  
  31.  
  32.  
  33. SELECT first_name, last_name, hire_date
  34. FROM employee
  35. WHERE 'today' - hire_date > 365 * 7 + 1
  36.  
  37.  
  38.  
  39.  
  40.  
  41. FIRST_NAME LAST_NAME HIRE_DATE
  42. =============== ==================== ===========
  43. Robert Nelson 28-DEC-1988
  44. 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

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

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

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

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

Emma (статус: Посетитель), 1 июня 2008, 22:13 [#8]:

Признаться честно, пока не въезжаю, о чем речь, но постараюсь разобраться ))) Спасибо за помощь!
Emma

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

Emma (статус: Посетитель), 12 июня 2008, 22:36 [#10]:

вот так всё работает

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:35
Выполнено за 0.02 сек.