Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Возраст сотрудника [D6, Access]


Oxer ©   (2004-05-15 22:14:00) 

Доброй ночи, надеюсь не спите.
Не могу никак вычислить скоко лет сотруднику
Делаю
Vozrast.Value:=DateToStr(Date)-DateToStr(SotrTableBirthDate.Value);
Пишет
[Error] DataModuleUnit.pas(294): Operator not applicable to this operand type


roottim   (2004-05-17 10:38:00) [1]

переписал свою с PL/sql на делфи - для д6 подойдет
uses DateUtils;

function Age(ADof: TDateTime): Integer;
var d: integer;
begin
  d := 0;
  Result := (YearOf(Date)*12 + MonthOf(Date)) - (YearOf(ADof)*12 + MonthOf(ADof));
  if (Result mod 12 = 0) and (DayOf(ADof) < DayOf(Date)) then d := -1;
  Result := (Result div 12) + d;
end;


Term   (2004-05-16 15:24:00) [2]

вроде если не ошибаюсь в RxLib есть функция которая определяет промежуток между датами DateDiff или чтото такое точно не помню


Anatoly Podgoretsky   (2004-05-16 14:55:00) [3]

sniknik ©   (16.05.04 01:07) [13]
Дело хуже, уже на червертый год, год наступит раньше, правда через несколько дней положение исправится, но ситуация будет повторять каждый год, на границе. Поэтому надо делить на 365,25 и далее или оставлять дробное число или брать челую чать, как число исполнивших лет, но не в коем случае не округление.


sniknik   (2004-05-16 12:27:00) [4]

SpartakVC   (16.05.04 01:50) [14]
так нельзя, получится если кто родился под новый год то через минуты/час ему будет уже год...

Fedia   (16.05.04 01:58) [15]
если так то round вместо trunc, иначе если в периоде нет высокосных годов (до 3 лет), или их меньше чем 1/4 от обшего, то год наоборот потеряется (будет небольшое оставание в дроби и оно обрежется).


Oxer   (2004-05-16 12:05:00) [5]

На этот момент, пока ничего не сделал, только сейсас приступаю.
Вам всем БОЛЬШОЕ СПАСИБО, надеюсь разберусь дальше сам.


Fedia   (2004-05-16 01:58:00) [6]

Тебе уже вроде все сказали. Возможно, даже ты уже все сделал.
Но на дворе воскресенье. У нас самый разгар дня. Работать особой охоты нет... Вот и написал. Может быть пригодится.
Скопируй себе эту функцию.

function FindBirthDate(BirthDate: TDateTime): Word;
begin
 Result:=Trunc((Date-trunc(BirthDate)) / 365.25);
end;


А значение поле возрат вычисляй так:
Vozrast.Value:= FindBirthDate(SotrTableBirthDate.Value);


SpartakVC   (2004-05-16 01:50:00) [7]

Попробую следующий вариант
var
 Birth: TDate;
 Vozr: DWORD;
begin
 Birth := StrToDate(Edit1.Text);
 Vozr := YearOf(Now) - YearOf(Birth);
 Edit2.Text := IntToStr(Vozr); // возраст в годах
end;

В SQL вместо Now используй date


sniknik   (2004-05-16 01:07:00) [8]

точнее 1 год на 1460 лет.


sniknik   (2004-05-16 01:05:00) [9]

упс > только на 365-й * 4


sniknik   (2004-05-16 01:03:00) [10]

ну да, но с точки зрения лет (остальное все одно откидывается), дополнительный год накопится только на 365-й (если правильно посчитал), если только возраст мумий считать... ;о)

Oxer
ну так если поставил дробь то целочисленные операции уже не пойдут.
> если можно напишите полный текст SQL-запроса
полный текст запроса уже был, настолько полный насколько возможно при отсутствующей структуре таблици.


Oxer   (2004-05-16 00:59:00) [11]

Не засыпайте!!!
ОЧЧЕНЬ НАДО!!!


Oxer   (2004-05-16 00:52:00) [12]

Что то я совсем уже запутался!ю!Юв.
Есть поле "BirthDate"-типа Дата/Время и "Vozrast" - числовое в SotrTable, как мне туда занести сколько человеку лет, когда пишу
>Vozrast.Value:= trunc(Date() - SotrTableBirthDate.Value) div
>365,25,
то Delph ругается на неправильные параметры,
если можно напишите полный текст SQL-запроса
Спасибо.


Anatoly Podgoretsky   (2004-05-16 00:32:00) [13]

Без 365,25 на сто лет будет ощибка почти в месяц, а так только в один день в зависимости от високосного столения.


sniknik   (2004-05-16 00:27:00) [14]

а иначе зачем в базах?
то же самое переделано из
> Vozrast.Value:=DateToStr(Date)-DateToStr(SotrTableBirthDate.Value);
Vozrast.Value:= trunc(Date() - SotrTableBirthDate.Value) div 365;

Anatoly Podgoretsky ©   (16.05.04 00:01) [4]
ну зачем такая точность? ;о) тем более операция целочисленная все одно обрежется.


Oxer   (2004-05-16 00:09:00) [15]

Please!!!


Oxer   (2004-05-16 00:05:00) [16]

>select sotrname, (date()-SotrBirthDate) \ 364 as sotrold from >
>sotrtable
Это что ч/з SQL? -(
А значение "скоко лет" как занести в поле.


Anatoly Podgoretsky   (2004-05-16 00:01:00) [17]

365.25


sniknik   (2004-05-15 23:29:00) [18]

select sotrname, (date()-SotrBirthDate) \ 364 as sotrold from sotrtable
правда возможна погрешность при больших сроках ;о)


Oxer   (2004-05-15 22:41:00) [19]

Да я и сам знаю, что какую хр... пишу, как сделать можешь посоветовать?


RayRom   (2004-05-15 22:20:00) [20]

Что ты хочеш, из строки строку отнять не использу преобразования, дата - дата и все, а из строки строку не отнимеш, в смысле как строковый параметр.


Наверх

Титульная страница Поиск, карта сайта Написать письмо