标题:请教问题(一)?
只看楼主
shzhshg
Rank: 1
等 级:新手上路
帖 子:147
专家分:0
注 册:2010-5-7
结帖率:85.71%
已结贴  问题点数:5 回复次数:8 
请教问题(一)?
测评.zip (2.19 KB)

请问老师,在qq.dbf中如何使所有记录的查体日期-出生日期得到年龄和月龄?
         我只能得到第1条记录的年龄和月龄,后面的几条出不来?
搜索更多相关主题的帖子: 出生日期 记录 如何 
2014-05-19 09:52
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:649
专家分:2156
注 册:2014-2-7
得分:3 
程序代码:
set date ansi
set century on
use qq.dbf
scan
    d1 = 出生日期              
    d2 = 查体日期
    nYear = year(d2)-year(d1)          && 求相差年份
    nMont = mont(d2)-mont(d1)          && 求相差月份
    if nMont < 0                       && 若查体日期的月份比出生日期的月份小
        nYear = nYear - 1              && 修正年份
        nMont = nMont + 12             && 修正月份
    endif
    replace 年龄 with tran(nYear)+''+tran(nMont)+'',月龄 with tran(nYear*12 + nMont)
ENDSCAN
甚至可以使用一条命令搞定:
repl all 月龄 with tran((year(查体日期)-year(出生日期))*12+mont(查体日期)-mont(出生日期)),年龄 with tran(int(VAL(月龄)/12))+'岁'+tran(val(月龄)%12)+'月'

泉城飞狐
2014-05-19 11:12
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
以下是引用liuxingang28在2014-5-19 11:12:58的发言:

set date ansi
set century on
use qq.dbf
scan
    d1 = 出生日期               
    d2 = 查体日期
    nYear = year(d2)-year(d1)          && 求相差年份
    nMont = mont(d2)-mont(d1)          && 求相差月份
    if nMont < 0                       && 若查体日期的月份比出生日期的月份小
        nYear = nYear - 1              && 修正年份
        nMont = nMont + 12             && 修正月份
    endif
    replace 年龄 with tran(nYear)+'岁'+tran(nMont)+'月',月龄 with tran(nYear*12 + nMont)
ENDSCAN甚至可以使用一条命令搞定:
repl all 月龄 with tran((year(查体日期)-year(出生日期))*12+mont(查体日期)-mont(出生日期)),年龄 with tran(int(VAL(月龄)/12))+'岁'+tran(val(月龄)%12)+'月'
是不是应该还要判断"日"?

坚守VFP最后的阵地
2014-05-19 11:30
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:649
专家分:2156
注 册:2014-2-7
得分:0 
以下是引用sdta在2014-5-19 11:30:25的发言:

是不是应该还要判断"日"?
这主要看“年龄”和“月龄”的定义。我是从楼主的数据和示例来推测的。我在为人事部门编写软件时,就遇到过类似问题。有些统计报表,比如:截止到某一时间点,有哪些员工达到退休年龄了?这时,计算年龄时不但要判断年,还要判断月和日;而在年龄结构统计报表中,计算年龄时仅判断年即可。很多具体问题需要看用户的要求,这不是我们程序员能决定的。

泉城飞狐
2014-05-19 11:50
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
从儿童保健的角度来讲,月龄应该为满月,而不是虚月,如果楼主连这个问题都没考虑到,月龄也就没有意义了。这个问题我在楼主前面的帖子中,已经给予提示。

坚守VFP最后的阵地
2014-05-19 12:01
shzhshg
Rank: 1
等 级:新手上路
帖 子:147
专家分:0
注 册:2010-5-7
得分:0 
回复 5 楼 sdta
老师,以前你说过满月的事。

字段名   类型
出生日期  字符
查体日期  字符
月  龄  字符

例如:出生日期  2004.05.10
   查体日期  2008.10.06
   如何得到月龄  4岁5月?

应该是4岁4个多月
那这个满月如何得到呢?
2014-05-19 12:47
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:3 
程序代码:
Close Databases
Use Qq
Replace All 月龄 With Transform((Year(查体日期)-Year(出生日期))*12+Month(查体日期)-Month(出生日期)+Iif(Day(查体日期)-Day(出生日期)>=0,0,-1))+"月",;
年龄 With Iif(Int(Val(月龄)/12)=0,"",Transform(Int(Val(月龄)/12))+"岁")+Iif(Val(月龄)%12=0,"",Transform(Val(月龄)%12)+"月")
Browse 

坚守VFP最后的阵地
2014-05-19 12:54
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:649
专家分:2156
注 册:2014-2-7
得分:0 
如果考虑“日”,情况就复杂了。比如:出生日期是 2005.02.28,而查体日期是 2008.10.29,则月龄是 3岁8个月呢,还是 3岁7个月呢?两种结果似乎都有道理,仅以日的大小来比较,由于29>28,得出 3岁8个月;若以天数在月份中的位置来说,28日是2月的最后一天,而29日不是10月最后一天,得出3岁7个月。因此,月龄的算法必须明确才能编写代码。


[ 本帖最后由 liuxingang28 于 2014-5-19 13:09 编辑 ]

泉城飞狐
2014-05-19 13:02
fyyylyl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:16
帖 子:287
专家分:676
注 册:2006-5-22
得分:0 
REPLACE ALL 月龄 WITH Rmonth(出生日期,查体日期)
REPLACE ALL 年龄 with ALLTRIM(STR(VAL(月龄)/12))+"年"+ALLTRIM(STR(MOD(VAL(月龄),12)))+"月"

Function Rmonth
PARAMETERS Bdate,Edate
nMonth=1
DO Whil .t.
    IF GOMONTH(Bdate,nMonth)>Edate
        EXIT
    Endif
    nMonth=nMonth+1
ENDDO
RETURN STR(nMonth-1,2)

2014-05-20 17:18



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-431753-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027369 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved