![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Возраст сотрудника [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]Что ты хочеш, из строки строку отнять не использу преобразования, дата - дата и все, а из строки строку не отнимеш, в смысле как строковый параметр.