Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > DateBase и тип Date


Автор: German 3.11.2002, 21:19
В базе есть поле Date типа Date.
Как произвести отбор по этим датам допустим с 09.10.2002 по 09.11.2002

пример кода:
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
with Table1 do
begin
IndexFieldNames:= 'date';
setrangestart;
Table1date.AsDateTime:=11.11;
//FieldByName(date).AsDateTime;
SetRangeEnd;
Table1date.AsDateTime:=11.12;
ApplyRange;
end;

end;


результат параметры можно задовать вида хх.хх и даже при этом ни какого результата только куча ошибок!!!

Автор: Medved 4.11.2002, 00:11
А не проще ли использовать простейший SQL запрос?
Если же надо TTable то отфильтруй значения через TTable.Filter (хотя фильтровку не рекомендую).

Или я чего-то непонимаю?

Автор: Medved 4.11.2002, 00:21
Или используй метод SetRange (он объединяет в себе все три метода SetRangeStart, SetRangeEnd и ApplyRange)

Хотя я тебе не рекомендую  осуществлять фильтрация по индескным полям...


И еще одна заметка, фильтрация методами ApplyRange/SetRange должна производиться только по ключевым полям. Хотя у тебя это и предусмотрено, но возможно здесь у тебя какая-то загвозтка.

Автор: German 7.11.2002, 20:02
Цитата(Pegas @ 03.11.2002, 08:11)
А не проще ли использовать простейший SQL запрос?

Я скуел не знаю  :(  не подскажешь что за операторы надо использовать и если не сложно примерчик.

Автор: Vit 7.11.2002, 22:57
Код

Query1.sql.text:='Select * From TableName Where (Date>:D1) and (Date<:D2)';
Query1.params.parsSql(Query1.sql.text, true);
Query1.params.parambyname('d1').value:=Stringtodatetime('09.10.2002');
Query1.params.parambyname('d2').value:=Stringtodatetime('09.11.2002');
Query1.active:=true;

Далее работаешь с Query1 так как если бы это была таблица.
Код писал на вскидку так что могут быть мелкие опечатки


Автор: Vit 7.11.2002, 23:00
В твоём коде ошибка здесь:

Table1date.AsDateTime:=11.11;

Компилятор интерпретирует 11.11 как "11 целых 11 сотых". Тип TDateTime - это тип real, где целая часть количество дней прошедших с 1 января 1899 года, а дробная часть - это время...

Автор: German 12.11.2002, 08:50
Сенькью веримач  :)

Автор: Cashey 14.11.2002, 03:31
Вот простой SQL код:
SELECT Date
from TableName
where beetwen '01/01/2002' and '31/01/2002'
И ненадо мучится TQuery, запусти SQLBuilder


Автор: Vit 14.11.2002, 03:55
Цитата(Cashey @ 13.11.2002, 10:31)
SELECT Date
from TableName
where beetwen '01/01/2002' and '31/01/2002'


В этом коде 2 ошибки, точнее неточности, которые могут стать потенциальными ошибками, именно по этому я и привёл код с параметрами. Итак:

1) Не все SQL сервера понимают строки как нечто в одинарных кавычках, некоторые требуют двойных кавычек, некоторые сервера могут быть настроены на одинарные ил двойные кавычки. Если дату передавать как параметер, то конечную кверю будет строить сам сервер, и он поставит те кавычки, которые нужны.

2) Где гарантия что формат даты одинаковый на компьютере с программой и компьютере с базой данных? У меня может стоять на клиенте русская винда с русскими настройками и '2/9/2002' будет интерпретироваться как "2 сентября", а на компьютере с базой данных стоит регионарный стандарт для Америки и эта же дата будет означать "9 февраля". (Про разделители полей даты я уже молчу). В этом случае так же параметры работают корректнее - серверу передаётся дата, а он делает кверю в соответствии со своими регионарными стандартами.


Автор: Medved 15.11.2002, 08:29
В случае работы с Oracle ему без разницы... в нем, чтобы записать дату требуется следующее (по другому он не воспринимает):

Код

 dm.qOperation.Close;
 dm.qOperation.SQL.Clear;
 dm.qOperation.SQL.Add('INSERT INTO Shema.MyTable (ID_My, NameB, DateB)');
 dm.qOperation.SQL.Add('VALUES (Shema.SEC_ID_My.NEXTVAL,'+''''+e1.Text+''', TO_DATE('''+(Date+''', ''DD.MM.YYYY HH24:MI:SS''))');
 dm.qOperation.Execute;

Автор: Medved 15.11.2002, 08:41
блин, ошибка.....

Автор: Medved 15.11.2002, 08:42
в предыдущем коде ошибка, вот правильный:

Код

VAR Date_my: String;
......
 Date_My := DateToStr(Date)+' '+TimeToStr(Time);

dm.qOperation.Close;
dm.qOperation.SQL.Clear;
dm.qOperation.SQL.Add('INSERT INTO Shema.MyTable (ID_My, NameB, DateB)');
dm.qOperation.SQL.Add('VALUES (Shema.SEC_ID_My.NEXTVAL,'+''''+e1.Text+''', TO_DATE('''+Date_my+''', ''DD.MM.YYYY HH24:MI:SS''))');
dm.qOperation.Execute;

Автор: Vit 15.11.2002, 08:43
Там клавиша Edit есть для таких случаев - отредактируй ответ, а потом остальные сотри, а то между 3мя ответами уже не теряется где-то правильный...

Автор: Medved 15.11.2002, 08:45
уже выкрутился.....

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)