Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ TDate

Автор: мисс_граффити 13.09.2007 3:22

Здравствуйте.
Ситуация: есть база данных людей. Одно из полей - дата рождения. TDate.
Задача: надо выбрать тех, у кого сегодня день рождения (а еще лучше - тех, у кого день рождения попал в интервал +-3 дня от сегодняшней даты).
Проблема: грубо говоря, дата хранится в виде "сколько дней прошло от 30 декабря 1899". то есть найти тех, кто родился _сегодня_ - не проблема. А тех, кто родился в этот день n лет назад - не знаю как sad.gif
Можно, конечно, сделать перебор по годам... но что-то меня такой вариант не радует.

Подскажете что-нибудь?
---
Нашла DecodeDate
Уже лучше, но не идеальный вариант (воспользоваться фильтром не получится). Так что вопрос актуален.

Автор: volvo 13.09.2007 3:52

if Abs(DaysBetween(IncYear(Today(), - { число лет назад }), { очередная дата })) <= 3 then ...
?

Автор: мисс_граффити 13.09.2007 4:01

Опять же - полный перебор
1) по записям
2) по годам
sad.gif
А так хотелось бы просто написать

Filter:='DateOfBirth.Day="+IntToStr(Now.Day)

и пусть оно там само фильтруется как хочет.

Автор: volvo 13.09.2007 4:04

Можно пойти гораздо более простым путем:

if DayOfTheYear({дата}) = DayOfTheYear(Today()) then ...
, но будет проблема с високосными годами... Хотя и это решаемо...

Автор: мисс_граффити 13.09.2007 4:15

Это, похоже, то что нужно.
Спасибо большое!

а с високосными... там получается с марта (точнее, как раз с 29 февраля) "сползание" номера на 1... будет дополнительное условие...

Автор: klem4 13.09.2007 13:08

Цитата
Нашла DecodeDate
Уже лучше, но не идеальный вариант (воспользоваться фильтром не получится)


Почему не получится ? А если обрабатывать в OnFilterRecord ? Так можно писать выражения для отбора любой сложности ...

В обработчике проверять:

if (сейчас должна проводиться нужная фильтрация) then beign
// нужный код
Accept := (условие для отображения = true)
end;


+можно без onFilterRecord, юзать SetRange например.

Автор: мисс_граффити 13.09.2007 18:49

я так пока просто не умею smile.gif
буду пробовать.

как применить SetRange - не придумала. В этом-то и проблема.
Если бы нужны были люди, родившиеся, например, с 1.09.1988 по 10.09.1988 - без проблем. А как задать, что интересует ЛЮБОЙ год?...

Автор: volvo 13.09.2007 19:43

Юля, еще один вариант - использовать SQL-Query... Только что создал маленькую табличку в Access-е, заполнил ее поле DateOfBirth разными датами, и связал TADOQuery с TDBGrid-ом... А заполняется Query вот так:

procedure TForm1.Button1Click(Sender: TObject);
begin
with ADOQuery1 do begin
with SQL do begin
Clear;
Add('SELECT id, DateOfBirth');
Add('FROM Table1');
Add('WHERE (((Abs(DatePart("y",[DateOfBirth])-DatePart("y",Now())))<=' +
Edit1.Text + '))');
end;
Open;
end;
end;

(в Edit1 - задаваемый тобой интервал, количество дней +/- от сегодняшнего числа)...