powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Определение возраста
25 сообщений из 187, страница 1 из 8
Определение возраста
    #36104822
Евгений1111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Люди помогите плизз
недавно начал программировать на VFP
есть ли функция определение возраста
...
Рейтинг: 0 / 0
Определение возраста
    #36104841
homik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такой функции нет.
В хелпе найдите функции для работы с датами и через них.

З.Ы. Само по себе вычисление возраста - задача нетривиальная.
З.З.Ы . Как вариант, смотрите по ссылке
http://forum.foxclub.ru/read.php?32,177182,321849#msg-321849
...
Рейтинг: 0 / 0
Определение возраста
    #36104896
Евгений1111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
homik,

Да я это уже понял, перерыл все что можно, может у кого есть готовая функция!!!
Заранее СПАСИБО!!!!!!
...
Рейтинг: 0 / 0
Определение возраста
    #36104968
Евгений1111homik,

Да я это уже понял, перерыл все что можно, может у кого есть готовая функция!!!
Готовая для кого? Вам же дали ссылку на статью, в которой достаточно ясно расписывается проблема расчета разницы дат. Вы ее прочитали?
...
Рейтинг: 0 / 0
Определение возраста
    #36104997
Евгений1111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[/quot]Готовая для кого? Вам же дали ссылку на статью, в которой достаточно ясно расписывается проблема расчета разницы дат. Вы ее прочитали?[/quot]

да в том то и дело что прочитал и не чего существенного там нет, я и сам могу написать только это куча проверок надо делать, может уже кто то с этим сталкивался и поможет избежать некоторых проблем
...
Рейтинг: 0 / 0
Определение возраста
    #36105005
Евгений1111Готовая для кого? Вам же дали ссылку на статью, в которой достаточно ясно расписывается проблема расчета разницы дат. Вы ее прочитали?[/quot]

да в том то и дело что прочитал и не чего существенного там нет, я и сам могу написать только это куча проверок надо делать, может уже кто то с этим сталкивался и поможет избежать некоторых проблем[/quot]Да этим сталкивались все, кто хоть каким-то боком связан с зарплатой, ЖКХ и т.д. Но у всех разные правила расчета. И потому каждый пишет для себя.
...
Рейтинг: 0 / 0
Определение возраста
    #36105026
Евгений1111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
проходящий.Евгений1111Готовая для кого? Вам же дали ссылку на статью, в которой достаточно ясно расписывается проблема расчета разницы дат. Вы ее прочитали?

да в том то и дело что прочитал и не чего существенного там нет, я и сам могу написать только это куча проверок надо делать, может уже кто то с этим сталкивался и поможет избежать некоторых проблем[/quot]Да этим сталкивались все, кто хоть каким-то боком связан с зарплатой, ЖКХ и т.д. Но у всех разные правила расчета. И потому каждый пишет для себя.[/quot]




да я это понимаю, есть ли у кого готовый код очень хотелось бы посмотреть, просто в фоксе я чайник
...
Рейтинг: 0 / 0
Определение возраста
    #36105081
homik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну раз хотите без кучи проверок и готовый пример то :

ldBirthDay = {^1972-02-01}
Age=Date()-ldBirthDay
? Age/365
...
Рейтинг: 0 / 0
Определение возраста
    #36105138
homik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну или так, более наглядно :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
ldBirthDay = {^ 1972 - 02 - 01 }
Age=Date()-ldBirthDay
lnFlowYear=Age/ 365 . 2 
lnYears=INT(lnFlowYear)
lnMonth=FLOOR((lnFlowYear-lnYears)* 12 )
lnDay=((lnFlowYear-lnYears)* 12 -FLOOR((lnFlowYear-lnYears)* 12 ))* 29 . 7 
? 
? lnFlowYear
? lnYears," лет",lnMonth," месяцев",lnDay," дней"

Тут надо более точнее определиться с коэф.-ми 365.2 и 29.7
...
Рейтинг: 0 / 0
Определение возраста
    #36105147
homik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
ldBirthDay = {^ 1972 - 02 - 01 }
Age=Date()-ldBirthDay
lnFlowYear=Age/ 365 . 2 
lnYears=INT(lnFlowYear)
lnMonth=Floor((lnFlowYear-lnYears)* 12 )
lnDay=Ceiling(((lnFlowYear-lnYears)* 12 -lnMonth)* 29 . 7 )
? 
? lnFlowYear
? lnYears," лет",lnMonth," месяцев",lnDay," дней"
...
Рейтинг: 0 / 0
Определение возраста
    #36105174
Kruchinin Pahan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
homik
Тут надо более точнее определиться с коэф.-ми 365.2 и 29.7
Коэффициент 365.2 означает, что у вас один високосный год каждые пять лет (включительно). В реальной ситуации, у нас один високосный год на каждые четыре года (включительно). То-есть, коэффициент должен быть 365.25.

Ограничение на этот коэффициент, такое: дата должна быть в пределах 01.03.1900 и 28.02.2100. Дело в том, что 1900 и 2100 годы - невисокосные.

С месяцами хуже. Коэффициента недостаточно.
...
Рейтинг: 0 / 0
Определение возраста
    #36105189
Евгений1111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
homikили так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
ldBirthDay = {^ 1972 - 02 - 01 }
Age=Date()-ldBirthDay
lnFlowYear=Age/ 365 . 2 
lnYears=INT(lnFlowYear)
lnMonth=Floor((lnFlowYear-lnYears)* 12 )
lnDay=Ceiling(((lnFlowYear-lnYears)* 12 -lnMonth)* 29 . 7 )
? 
? lnFlowYear
? lnYears," лет",lnMonth," месяцев",lnDay," дней"



спасибо только вот если месяц будет не 01 а больше сегодняшнего напр. 11 то месяц получается отрицательное и неправильное значение
...
Рейтинг: 0 / 0
Определение возраста
    #36105248
homik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНу раз хотите без кучи проверок и готовый пример то :

А это для чего я написал ?
Напильник в руки и "алга" :)
...
Рейтинг: 0 / 0
Определение возраста
    #36105282
Евгений1111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
homikавторНу раз хотите без кучи проверок и готовый пример то :

А это для чего я написал ?
Напильник в руки и "алга" :)

спасибо, сейчас сделаю
...
Рейтинг: 0 / 0
Определение возраста
    #36105559
Евгений1111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Евгений1111homikавторНу раз хотите без кучи проверок и готовый пример то :

А это для чего я написал ?
Напильник в руки и "алга" :)

спасибо, сейчас сделаю



вот что получилось

ldBirthDay = {^2008-06-29}
Age=Date()-ldBirthDay
lnFlowYear=Age/365.2
lnYears=INT(lnFlowYear)
lnMonth=Floor((lnFlowYear-lnYears)*12)
IF lnMonth<0 THEN
lnMonth=lnMonth+12
ENDIF
lnDay=Ceiling(((lnFlowYear-lnYears)*12-lnMonth)*29.7)
?
? lnFlowYear
? lnYears," лет",lnMonth," Месяцев",lnDay," дней"
...
Рейтинг: 0 / 0
Определение возраста
    #36105649
Kruchinin Pahan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений1111
вот что получилось

Хренова получилось.
Погрешность: 5 дней за 100 лет.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CLEAR
ldBirthDay = {^ 1910 . 01 . 01 }
ldStartDay = {^ 2010 . 01 . 01 }

Age=ldStartDay-ldBirthDay
lnFlowYear=Age/ 365 . 2 
lnYears=INT(lnFlowYear)
lnMonth=Floor((lnFlowYear-lnYears)* 12 )
IF lnMonth< 0  THEN 
lnMonth=lnMonth+ 12 
ENDIF
lnDay=Ceiling(((lnFlowYear-lnYears)* 12 -lnMonth)* 29 . 7 )
? 
? lnFlowYear
? lnYears," лет",lnMonth," Месяцев",lnDay," дней"

Поправьте константы, как-минимум.
2001200220032004Среднееянварь3131313131февраль2828282928.25март3131313131апрель3030303030май3131313131июнь3030303030июль3131313131август3131313131сентябрь3030303030октябрь3131313131ноябрь3030303030декабрь3131313131дней в году365365365366365.25дней в месяце30.4166666730.4166666730.4166666730.530.4375
...
Рейтинг: 0 / 0
Определение возраста
    #36105720
Евгений1111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А лучше всего вот так



ldBirthDay = {^2009-02-24}
lnYears=YEAR(DATE())-year(ldBirthDay)
lnMonth=MONTH(DATE())-MONTH(ldBirthDay)
IF lnMonth<0 THEN
lnMonth=lnMonth+12
ENDIF
y=31
f=28
m=31
a=30
_m=31
i=30
_i=31
_a=31
s=30
o=31
n=30
d=31
p=DAY(ldBirthDay)
l=DAY(DATE())
m1=l-p
IF m1>=0 then
lnDay=m1
ENDIF
IF m1<0 then
lnMonth=lnMonth-1
DO CASE
CASE MONTH(ldBirthDay)=1
lnDay=y-p+l
CASE MONTH(ldBirthDay)=2
IF MOD(YEAR(ldBirthDay),4)=0 then
lnDay=f+1-p+l
ELSE
lnDay=f-p+l
ENDIf
CASE MONTH(ldBirthDay)=3
lnDay=m-p+l
CASE MONTH(ldBirthDay)=4
lnDay=a-p+l
CASE MONTH(ldBirthDay)=5
lnDay=_m-p+l
CASE MONTH(ldBirthDay)=6
lnDay=i-p+l
CASE MONTH(ldBirthDay)=7
lnDay=_i-p+l
CASE MONTH(ldBirthDay)=8
lnDay=_a-p+l
CASE MONTH(ldBirthDay)=9
lnDay=s-p+l
CASE MONTH(ldBirthDay)=10
lnDay=o-p+l
CASE MONTH(ldBirthDay)=11
lnDay=n-p+l
CASE MONTH(ldBirthDay)=12
lnDay=d-p+l
ENDCASE
endif
? lnYears," лет",lnMonth," месяцев",lnDay," дней"
...
Рейтинг: 0 / 0
Определение возраста
    #36105734
homik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот непруха.
Не хотел человек проверок. А ему навязывают и навязывают. Непорядок, однако :) :) :)
...
Рейтинг: 0 / 0
Определение возраста
    #36105766
Евгений1111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
homikНу вот непруха.
Не хотел человек проверок. А ему навязывают и навязывают. Непорядок, однако :) :) :)


да нет я не то чтобы не хотел проверок, я не хотел их думать и писать, думал может у кого похожее есть- посмотреть чтобы не заморачиваться но все равно пришлось самому всем спасибо
...
Рейтинг: 0 / 0
Определение возраста
    #36105777
Евгений1111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ой строчку одну пропустил!!!!!

ldBirthDay = {^2008-11-23}
lnYears=YEAR(DATE())-year(ldBirthDay)
lnMonth=MONTH(DATE())-MONTH(ldBirthDay)
IF lnMonth<0 THEN
lnMonth=lnMonth+12
lnYears=lnYears-1
ENDIF
y=31
f=28
m=31
a=30
_m=31
i=30
_i=31
_a=31
s=30
o=31
n=30
d=31
p=DAY(ldBirthDay)
l=DAY(DATE())
m1=l-p
IF m1>=0 then
lnDay=m1
ENDIF
IF m1<0 then
lnMonth=lnMonth-1
DO CASE
CASE MONTH(ldBirthDay)=1
lnDay=y-p+l
CASE MONTH(ldBirthDay)=2
IF MOD(YEAR(ldBirthDay),4)=0 then
lnDay=f+1-p+l
ELSE
lnDay=f-p+l
ENDIf
CASE MONTH(ldBirthDay)=3
lnDay=m-p+l
CASE MONTH(ldBirthDay)=4
lnDay=a-p+l
CASE MONTH(ldBirthDay)=5
lnDay=_m-p+l
CASE MONTH(ldBirthDay)=6
lnDay=i-p+l
CASE MONTH(ldBirthDay)=7
lnDay=_i-p+l
CASE MONTH(ldBirthDay)=8
lnDay=_a-p+l
CASE MONTH(ldBirthDay)=9
lnDay=s-p+l
CASE MONTH(ldBirthDay)=10
lnDay=o-p+l
CASE MONTH(ldBirthDay)=11
lnDay=n-p+l
CASE MONTH(ldBirthDay)=12
lnDay=d-p+l
ENDCASE
endif
? lnYears," лет",lnMonth," месяцев",lnDay," дней"
...
Рейтинг: 0 / 0
Определение возраста
    #36105897
George1974
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Replace Year With Max(Year(Date()) - Year(Nvl(Birthday,{})) - IIF(Month(Nvl(Birthday,{}))*100+Day(Nvl(Birthday,{})) > Month(Date())*100+Day(Date()),1,0),0) For !Empty(Nvl(Birthday,{}))
...
Рейтинг: 0 / 0
Определение возраста
    #36106008
Евгений1111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
George1974Replace Year With Max(Year(Date()) - Year(Nvl(Birthday,{})) - IIF(Month(Nvl(Birthday,{}))*100+Day(Nvl(Birthday,{})) > Month(Date())*100+Day(Date()),1,0),0) For !Empty(Nvl(Birthday,{}))

и что это значит, что то я не как не пойму!!!!!!! что то она не работает!!!!!
...
Рейтинг: 0 / 0
Определение возраста
    #36106847
fvi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
fvi
Гость
FUNCTION Year_month
LPARAMETER tdDate_inp, tdDate_out
LOCAL lcReturn, ldSs, ldDate_flow, lnYear, lnMonth, lcYear, lcMonth

lcReturn = ''
IF tdDate_inp != CTOD("00.00.0000") AND tdDate_out != CTOD("00.00.0000")
ldSs = tdDate_inp
ldDate_flow = ldSs
lnYear = 0
ldSs = GOMONTH(ldSs,12)
DO WHILE( ldSs <= tdDate_out )
ldDate_flow = ldSs
ldSs = GOMONTH(ldSs,12)
lnYear = lnYear + 1
ENDDO

IF lnYear = 0 OR ldSs > tdDate_out
ldSs = ldDate_flow
lnMonth = 0
DO WHILE( ldSs <= tdDate_out )
ldDate_flow = ldSs
ldSs = GOMONTH(ldSs,1)
lnMonth = lnMonth + 1
ENDDO
ENDIF
lnMonth = lnMonth - 1

IF lnYear != 0
IF lnYear >= 10
lcReturn = STR(lnYear,3)
ELSE
lcReturn = STRTRAN(STR(lnYear,3),'0',' ')
ENDIF

DO CASE
CASE SUBSTR(STR(lnYear,3),2,1) = '1' OR SUBSTR(STR(lnYear,3),3,1) = '0'
lcYear = ' лет '

CASE SUBSTR(STR(lnYear,3),3,1) = '1'
lcYear = ' год '

CASE SUBSTR(STR(lnYear,3),3,1) = '0' OR ;
SUBSTR(STR(lnYear,3),3,1) = '5' OR ;
SUBSTR(STR(lnYear,3),3,1) = '6' OR ;
SUBSTR(STR(lnYear,3),3,1) = '7' OR ;
SUBSTR(STR(lnYear,3),3,1) = '8' OR ;
SUBSTR(STR(lnYear,3),3,1) = '9'
lcYear = ' лет '

CASE SUBSTR(STR(lnYear,3),3,1) = '2' OR ;
SUBSTR(STR(lnYear,3),3,1) = '3' OR ;
SUBSTR(STR(lnYear,3),3,1) = '4'
lcYear = ' года '
ENDCASE

lcReturn = lcReturn + lcYear
ENDIF

IF lnMonth != 0
IF lnMonth >= 10
lcReturn = lcReturn + STR(lnMonth,2)
ELSE
lcReturn = lcReturn + STRTRAN(STR(lnMonth,2),'0',' ')
ENDIF

DO CASE
CASE SUBSTR(STR(lnMonth,2),2,1) = '1'
lcMonth = ' месяц'

CASE SUBSTR(STR(lnMonth,2),2,1) = '0' OR ;
SUBSTR(STR(lnMonth,2),2,1) = '5' OR ;
SUBSTR(STR(lnMonth,2),2,1) = '6' OR ;
SUBSTR(STR(lnMonth,2),2,1) = '7' OR ;
SUBSTR(STR(lnMonth,2),2,1) = '8' OR ;
SUBSTR(STR(lnMonth,2),2,1) = '9'
lcMonth = ' месяцев'

CASE SUBSTR(STR(lnMonth,2),2,1) = '2' OR ;
SUBSTR(STR(lnMonth,2),2,1) = '3' OR ;
SUBSTR(STR(lnMonth,2),2,1) = '4'
lcMonth = ' месяца'
ENDCASE

lcReturn = lcReturn + lcMonth
ENDIF

ENDIF

IF lnYear = 0 AND lnMonth = 0
lcReturn = '( Возраст: меньше месяца )'
ELSE
lcReturn = '( Возраст: ' + lcReturn + ' )'
ENDIF

RETURN lcReturn
ENDFUNC
****************************************
...
Рейтинг: 0 / 0
Определение возраста
    #36107391
George1974
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Евгений1111George1974Replace Year With Max(Year(Date()) - Year(Nvl(Birthday,{})) - IIF(Month(Nvl(Birthday,{}))*100+Day(Nvl(Birthday,{})) > Month(Date())*100+Day(Date()),1,0),0) For !Empty(Nvl(Birthday,{}))

и что это значит, что то я не как не пойму!!!!!!! что то она не работает!!!!!

Данный код заполнял в таблице поле Year - количество полных лет (т.к. возраст все таки считают в целых годах а не в годах, месяцах, днях, часах, минутах и секундах) в зависимости от даты рождения - Birthday

Попробуй так:

Birthday = {^1974-01-30}
If !Empty(Nvl(Birthday,{}))
Year = Max(Year(Date()) - Year(Nvl(Birthday,{})) - IIF(Month(Nvl(Birthday,{}))*100+Day(Nvl(Birthday,{})) > Month(Date())*100+Day(Date()),1,0),0)
EndIf
?Year
...
Рейтинг: 0 / 0
Определение возраста
    #36108210
Tohan_ORA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот мой вариант :-)

Код: plaintext
1.
set procedure to pr_dt
?fdt(date( 2008 , 2 , 29 ))
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
FUNCTION fdt
&&Функция определения возраста 
&&input date{ 1967 , 1 , 29 }
&&output char 'year= ;month= ;days= '
LPARAMETERS dt1 as date
IF EMPTY(dt1)
	RETURN ''
endif

LOCAL y1,m1,d1,dt,dt2,y2,d2,m2,ddd,y,m,d,dm
&&дата рождения
&&dt1 =DATE( 2008 , 2 , 28 ) 
y1=YEAR(dt1)
m1=month(dt1)
d1=DAY(dt1)

&&текущ дата
dt2=DATE()
&&dt2=DATE( 2008 , 2 , 29 )
y2=YEAR(dt2)
m2=MONTH(dt2)

dt=gomonth(dt1, 12 *(y2-y1))

	DO case
	CASE dt2=dt
		y=y2-y1 &&лет
		m= 0  &&месяцев
		d= 0  &&дней
	CASE  dt2>dt
		y=y2-y1
		ddd=GOMONTH(dt,m2-m1)
		
		DO case
		case ddd<dt2
			 m=m2-m1 
			 d=dt2-ddd
		CASE ddd=dt2
			m=m2-m1
			d= 0 
		OTHERWISE
			m=m2-m1- 1 
			d=dt2-GOMONTH(dt,m)
		endcase
		
	
	CASE dt2<dt
		y=y2-y1- 1 
		dt=GOMONTH(dt1, 12 *y)
			IF YEAR(dt)<YEAR(dt2)
				dm=m2+( 12 -MONTH(dt))
			ELSE
				dm=m2-MONTH(dt)
			ENDIF
		
		ddd=GOMONTH(dt,dm)
		DO case
		case ddd>dt2
			 m=dm- 1 
			 ddd=GOMONTH(dt,m)
			 d=dt2-ddd
		CASE ddd=dt2
			m=dm
			d= 0 
		OTHERWISE
			m=dm
			d=dt2-ddd
		endcase	
		
	ENDCASE
	
RETURN 'year='+LTRIM(STR(y))+';month='+LTRIM(STR(m))+';days='+LTRIM(STR(d))
...
Рейтинг: 0 / 0
25 сообщений из 187, страница 1 из 8
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Определение возраста
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]