请问如何知道两个日期之间有多少年多少月

时间:2022-09-15 09:04:25
请问在pb的数据窗口里知道两个日期之间比如1998-02-01和2006-03-01之间有多少个月,或者写成
两个日期之间有几年几个月几天

7 个解决方案

#1


我觉得只能大概的知道有几年几月,或者多少天
    有一种办法就是 DaysAfter得到天数/365=年,余数/30=月
    另外就是直接取日期字符串中的前四位成long,两个值相减得年份,6~7成long,两个值相减成月份

至于说的几年几月几天就不好办了,每年的数据严格的讲是不一样的,总之比较麻烦,呵呵

#2



这么来算 (年*12+月) - (年*12+月) 即可算出

如1998-02-01和2006-03-01

(2006 * 12 + 3) - (1998 * 12 + 2) = 97

#3


有一种办法就是 DaysAfter得到天数/365=年,余数/30=月 这个方法好像不行 有2月的28天在里面会出问题
 
 (2006 * 12 + 3) - (1998 * 12 + 2) = 97这个方法什么原理 好像月份是对的

#4


date ld_date,ld_date1
time lt_time,lt_time1
datetime adtm_start,adtm_end
long ll_total_seconds, ll_day_adjust 
date ld_sdate, ld_edate 
time lt_stime, lt_etime 
 
ld_Date = date(left(em_1.text,10))
lt_time =time(right(em_1.text,8))
adtm_end =datetime(ld_date,lt_time)

ld_date1=date(left(em_4.text,10))
lt_time1 =time(right(em_4.text,8))
adtm_start=datetime(ld_date1,lt_time1)


ld_sdate = date(adtm_start) 
ld_edate = date(adtm_end) 
lt_stime = time(adtm_start) 
lt_etime = time(adtm_end) 


If ld_sdate = ld_edate then 
ll_total_seconds = secondsafter( lt_stime,lt_etime) 
Elseif ld_sdate < ld_edate Then 
ll_total_seconds = SecondsAfter(lt_stime,Time('23:59:59')) 
ll_day_adjust = DaysAfter(ld_sdate,ld_edate) -1 
If ll_day_adjust > 0 Then ll_total_seconds = ll_total_seconds + 86400 * ll_day_adjust 
ll_total_seconds = ll_total_seconds + SecondsAfter(Time('00:00:00'),lt_etime) +1 
Else  
ll_total_seconds = SecondsAfter(lt_stime,Time('00:00:00')) 
ll_day_adjust = DaysAfter(ld_sdate,ld_edate) +1 
If ll_day_adjust < 0 Then ll_total_seconds = ll_total_seconds + 86400 * ll_day_adjust 
ll_total_seconds = ll_total_seconds + SecondsAfter(Time('23:59:59'),lt_etime) -1 
end If 
int li_days,li_hour,li_minute
li_minute = ll_total_seconds/60
li_days=ll_total_seconds/86400
li_hour=((ll_total_seconds)-(86400*(li_days)))/3600
li_minute=((((ll_total_seconds)-(li_days*(86400))))-((li_hour)*3600))/60

sle_3.text=string(li_days)+'天'+string(li_hour)+'小时'+string(li_minute)+'分钟'













#5


不用时间的,就是合同签订的时间,只有日期date,不是datetime类型的,也不用精确到小时、分什么,
  但是这么来算 (年*12+月) - (年*12+月) 即可算出

如1998-02-01和2006-03-01

(2006 * 12 + 3) - (1998 * 12 + 2) = 97
这个我试验了一下还是不行,算2004-06-20至2005-06-19还行,可是有的合同时间是2004-06-01至2005-05-31就不行了 这2个都是一年,但结果不都是12个月
  请大家帮忙啊,什么好办法啊!!!!

#6


算成月吧 这样好算点的 写个函数  我写了个你看看色
long n,y,z
IF (long(left(zzsj,4))-long(left(qssj,4)))>0 then 
y=(12 - long(right(qssj,2))+1)+long(right(zzsj,2))
n=(long(left(zzsj,4)) - long(left(qssj,4))-1)*12
z=y+n
else
z=long(right(zzsj,2))-long(right(qssj,2))+1
end if 
return z

#7


补充一下 zzsj终止时间 qssj起始时间 是一个参数

#1


我觉得只能大概的知道有几年几月,或者多少天
    有一种办法就是 DaysAfter得到天数/365=年,余数/30=月
    另外就是直接取日期字符串中的前四位成long,两个值相减得年份,6~7成long,两个值相减成月份

至于说的几年几月几天就不好办了,每年的数据严格的讲是不一样的,总之比较麻烦,呵呵

#2



这么来算 (年*12+月) - (年*12+月) 即可算出

如1998-02-01和2006-03-01

(2006 * 12 + 3) - (1998 * 12 + 2) = 97

#3


有一种办法就是 DaysAfter得到天数/365=年,余数/30=月 这个方法好像不行 有2月的28天在里面会出问题
 
 (2006 * 12 + 3) - (1998 * 12 + 2) = 97这个方法什么原理 好像月份是对的

#4


date ld_date,ld_date1
time lt_time,lt_time1
datetime adtm_start,adtm_end
long ll_total_seconds, ll_day_adjust 
date ld_sdate, ld_edate 
time lt_stime, lt_etime 
 
ld_Date = date(left(em_1.text,10))
lt_time =time(right(em_1.text,8))
adtm_end =datetime(ld_date,lt_time)

ld_date1=date(left(em_4.text,10))
lt_time1 =time(right(em_4.text,8))
adtm_start=datetime(ld_date1,lt_time1)


ld_sdate = date(adtm_start) 
ld_edate = date(adtm_end) 
lt_stime = time(adtm_start) 
lt_etime = time(adtm_end) 


If ld_sdate = ld_edate then 
ll_total_seconds = secondsafter( lt_stime,lt_etime) 
Elseif ld_sdate < ld_edate Then 
ll_total_seconds = SecondsAfter(lt_stime,Time('23:59:59')) 
ll_day_adjust = DaysAfter(ld_sdate,ld_edate) -1 
If ll_day_adjust > 0 Then ll_total_seconds = ll_total_seconds + 86400 * ll_day_adjust 
ll_total_seconds = ll_total_seconds + SecondsAfter(Time('00:00:00'),lt_etime) +1 
Else  
ll_total_seconds = SecondsAfter(lt_stime,Time('00:00:00')) 
ll_day_adjust = DaysAfter(ld_sdate,ld_edate) +1 
If ll_day_adjust < 0 Then ll_total_seconds = ll_total_seconds + 86400 * ll_day_adjust 
ll_total_seconds = ll_total_seconds + SecondsAfter(Time('23:59:59'),lt_etime) -1 
end If 
int li_days,li_hour,li_minute
li_minute = ll_total_seconds/60
li_days=ll_total_seconds/86400
li_hour=((ll_total_seconds)-(86400*(li_days)))/3600
li_minute=((((ll_total_seconds)-(li_days*(86400))))-((li_hour)*3600))/60

sle_3.text=string(li_days)+'天'+string(li_hour)+'小时'+string(li_minute)+'分钟'













#5


不用时间的,就是合同签订的时间,只有日期date,不是datetime类型的,也不用精确到小时、分什么,
  但是这么来算 (年*12+月) - (年*12+月) 即可算出

如1998-02-01和2006-03-01

(2006 * 12 + 3) - (1998 * 12 + 2) = 97
这个我试验了一下还是不行,算2004-06-20至2005-06-19还行,可是有的合同时间是2004-06-01至2005-05-31就不行了 这2个都是一年,但结果不都是12个月
  请大家帮忙啊,什么好办法啊!!!!

#6


算成月吧 这样好算点的 写个函数  我写了个你看看色
long n,y,z
IF (long(left(zzsj,4))-long(left(qssj,4)))>0 then 
y=(12 - long(right(qssj,2))+1)+long(right(zzsj,2))
n=(long(left(zzsj,4)) - long(left(qssj,4))-1)*12
z=y+n
else
z=long(right(zzsj,2))-long(right(qssj,2))+1
end if 
return z

#7


补充一下 zzsj终止时间 qssj起始时间 是一个参数