计算2个datetime之间的差值

时间:2023-01-09 08:11:54
计算2个datetime之间的差值 并做出判断 当结果小于等于5秒 则跳出或不写入数据库
datetime=ldt_dxsj,ldt_lxsj

是不是先要把datetime转为  int怎么转? 本人新手求教

11 个解决方案

#1


 有一个 secondsafter() 方法可以取两个时间的间隔,但是datetime 的话,要注意date 部份的判断。

#2


说明,adtm_start和adtm_end分别是你要比较的日期 
long ll_total_seconds, ll_day_adjust 
date ld_sdate, ld_edate 
time lt_stime, lt_etime

ld_sdate = date(adtm_start) 
ld_edate = date(adtm_end)

lt_stime = time(adtm_start) 
lt_etime = time(adtm_end)

//86400为一天的总秒数 
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 //end date < start date 
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

ll_total_seconds就是最终的秒数的差

#3


date我要的是秒 ldc_xxsj = round(secondsafter(time(ldt_dxsj),time(ldt_lxsj))/3600,2) 这样?

做个考勤 就是在避免重复刷卡做的判断 当第二次刷卡时间小于5秒 则不写入数据库

ldt_dxsj是第一次刷卡

ldt_lxsj是第二次刷卡

#4


secondsafter(time(ldt_dxsj),time(ldt_lxsj))得出的是秒数差,不用再 / 3600 了

#5


但是secondsafter是不考虑日期的
也就是说
secondsafter(time(2011-07-29 23:59:59),time(2011-07-30 00:00:01))
得出的秒数差不是2秒,而是 -86398秒

#6


我求的就是 当天的 基本不会超过10秒  越简洁越好 但是
secondsafter(time(ldt_lxsj),time(ldt_dxsj)) 就是编译通不过

#7


f_secondsafter(datetime adt_s, datetime adt_e)

if adt_s > adt_e then // 开始时间大于结束时间
return (daysafter(date(adt_e), date(adt_s)) * 86400 + secondsafter(time(adt_e), time(adt_s))) * -1
else
return daysafter(date(adt_s), date(adt_e)) * 86400 + secondsafter(time(adt_s), time(adt_e))
end if

#8


引用 6 楼 nbhtm2007 的回复:
我求的就是 当天的 基本不会超过10秒  越简洁越好 但是
secondsafter(time(ldt_lxsj),time(ldt_dxsj)) 就是编译通不过


编译不通过提示什么

#9


event modified;long ll_htbh
integer li_row1, li_htzt, li_row2, li_htlx
datetime ldt_dxsj, ldt_lxsj, ldt_sksj
dec{2} ldc_xxsj



ll_htbh = long(sle_htbh.text)
dw_1.settransobject(sqlca)
gs_string = dw_1.getsqlselect()
gs_select = mid(gs_string,1,pos(upper(gs_string),'WHERE') - 1)
gs_where =  " WHERE ( zy_cw_htxx.khid = zy_khxx.khid ) and ( zy_cw_htxx.htbh = " + string(ll_htbh) + " )"
gs_sql = gs_select+gs_where
dw_1.setsqlselect(gs_sql)
li_row1 = dw_1.retrieve()
if li_row1 = 0 or IsNull(li_row1) then
MessageBox('提示信息','您输入的合同编号不存在!',Exclamation!)
dw_1.reset()
dw_1.insertrow(0)
dw_2.reset()
dw_2.insertrow(0)
cb_dj.enabled = false
return
end if
li_htzt = dw_1.object.htzt[li_row1]
li_htlx = dw_1.object.htlx[li_row1]
ldt_sksj = gf_server_date()
if li_htzt = 2 then
MessageBox('提示信息','您的合同已经冻结!',Exclamation!)
dw_1.reset()
dw_1.insertrow(0)
dw_2.reset()
dw_2.insertrow(0)
cb_dj.enabled = false
return
elseif li_htzt > 2 then
MessageBox('提示信息','您的合同已经结束或中止!',Exclamation!)
dw_1.reset()
dw_1.insertrow(0)
dw_2.reset()
dw_2.insertrow(0)
cb_dj.enabled = false
return
elseif li_htlx = 2 and ldt_sksj > datetime(date(gf_server_date()),time('17:30:00')) then
MessageBox('提示信息','该学员是白天班的学员,请提醒学员按时离校!',Exclamation!)
dw_1.reset()
dw_1.insertrow(0)
dw_2.reset()
dw_2.insertrow(0)
cb_dj.enabled = false
return
else
cb_dj.enabled = true
ldt_dxsj = datetime(date(gf_server_date()),time('00:00:00'))
dw_2.settransobject(sqlca)
gs_string = dw_2.getsqlselect()
gs_select = mid(gs_string,1,pos(upper(gs_string),'WHERE') - 1)
gs_where =  " WHERE ( zy_jw_xxjl.htbh = " + string(ll_htbh) + " ) and ( zy_jw_xxjl.dxsj >= '" + string(ldt_dxsj) + "' ) and ( zy_jw_xxjl.lxsj is null )"
gs_sql = gs_select+gs_where
dw_2.setsqlselect(gs_sql)
li_row2 = dw_2.retrieve()
if li_row2 = 0 or IsNull(li_row2) then
li_row2 = dw_2.insertrow(0)
dw_2.object.jlid[li_row2] = gf_get_max(sqlca,'zy_jw_xxjl',1)
dw_2.object.htbh[li_row2] = ll_htbh
dw_2.object.khid[li_row2] = dw_1.object.khid[li_row1]
dw_2.object.dxsj[li_row2] = ldt_sksj
dw_2.object.dxdjgh[li_row2] = base_info.yhdm
else
ldt_dxsj = dw_2.object.dxsj[li_row2]
ldt_lxsj = ldt_sksj
dw_2.object.lxsj[li_row2] = ldt_lxsj
dw_2.object.lxdjgh[li_row2] = base_info.yhdm
ldc_xxsj = round(secondsafter(time(ldt_dxsj),time(ldt_lxsj))/3600,2)
dw_2.object.xxsj[li_row2] = ldc_xxsj
end if
end if
end event
上面是代码
ldt_dxsj是第一次刷卡

ldt_lxsj是第二次刷卡

ldc_xxsj是2数之差

我需要ldc_xxsj <=5秒 时不写入数据库 或者跳出

我用secondsafter(time(ldt_lxsj),time(ldt_dxsj)) 试过 
但是最后无法写入ldt_lxsj了 一直变成重复刷卡了

#10


最近回复过得帖子,被CSDN给沉了,重新顶起

#11


从2011年7月23日开始,到了每天凌晨,7月22日以后发的帖子和回复的帖子都会 被CSDN恶意的沉掉。每天早上上论坛,帖子列表中能看到的帖子的最后更新日期最晚是7月22日。这无疑让很多提问者的帖子无法被大家浏览,进而无法及时给予解答。

希望  版主:lzp_lrp  能够帮忙反映问题!!!

从“我的社区 → 我回复的帖子”中,可以正常的看到自己回复过的帖子,所以我决定每天手动将我回复过得帖子重新顶起来,希望大家理解并支持我的做法。

希望看到的人,可以帮忙顶一下,毕竟我只能连续 砌三楼

最近回复过的帖子,被 CSDN给沉了,重新顶起

#1


 有一个 secondsafter() 方法可以取两个时间的间隔,但是datetime 的话,要注意date 部份的判断。

#2


说明,adtm_start和adtm_end分别是你要比较的日期 
long ll_total_seconds, ll_day_adjust 
date ld_sdate, ld_edate 
time lt_stime, lt_etime

ld_sdate = date(adtm_start) 
ld_edate = date(adtm_end)

lt_stime = time(adtm_start) 
lt_etime = time(adtm_end)

//86400为一天的总秒数 
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 //end date < start date 
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

ll_total_seconds就是最终的秒数的差

#3


date我要的是秒 ldc_xxsj = round(secondsafter(time(ldt_dxsj),time(ldt_lxsj))/3600,2) 这样?

做个考勤 就是在避免重复刷卡做的判断 当第二次刷卡时间小于5秒 则不写入数据库

ldt_dxsj是第一次刷卡

ldt_lxsj是第二次刷卡

#4


secondsafter(time(ldt_dxsj),time(ldt_lxsj))得出的是秒数差,不用再 / 3600 了

#5


但是secondsafter是不考虑日期的
也就是说
secondsafter(time(2011-07-29 23:59:59),time(2011-07-30 00:00:01))
得出的秒数差不是2秒,而是 -86398秒

#6


我求的就是 当天的 基本不会超过10秒  越简洁越好 但是
secondsafter(time(ldt_lxsj),time(ldt_dxsj)) 就是编译通不过

#7


f_secondsafter(datetime adt_s, datetime adt_e)

if adt_s > adt_e then // 开始时间大于结束时间
return (daysafter(date(adt_e), date(adt_s)) * 86400 + secondsafter(time(adt_e), time(adt_s))) * -1
else
return daysafter(date(adt_s), date(adt_e)) * 86400 + secondsafter(time(adt_s), time(adt_e))
end if

#8


引用 6 楼 nbhtm2007 的回复:
我求的就是 当天的 基本不会超过10秒  越简洁越好 但是
secondsafter(time(ldt_lxsj),time(ldt_dxsj)) 就是编译通不过


编译不通过提示什么

#9


event modified;long ll_htbh
integer li_row1, li_htzt, li_row2, li_htlx
datetime ldt_dxsj, ldt_lxsj, ldt_sksj
dec{2} ldc_xxsj



ll_htbh = long(sle_htbh.text)
dw_1.settransobject(sqlca)
gs_string = dw_1.getsqlselect()
gs_select = mid(gs_string,1,pos(upper(gs_string),'WHERE') - 1)
gs_where =  " WHERE ( zy_cw_htxx.khid = zy_khxx.khid ) and ( zy_cw_htxx.htbh = " + string(ll_htbh) + " )"
gs_sql = gs_select+gs_where
dw_1.setsqlselect(gs_sql)
li_row1 = dw_1.retrieve()
if li_row1 = 0 or IsNull(li_row1) then
MessageBox('提示信息','您输入的合同编号不存在!',Exclamation!)
dw_1.reset()
dw_1.insertrow(0)
dw_2.reset()
dw_2.insertrow(0)
cb_dj.enabled = false
return
end if
li_htzt = dw_1.object.htzt[li_row1]
li_htlx = dw_1.object.htlx[li_row1]
ldt_sksj = gf_server_date()
if li_htzt = 2 then
MessageBox('提示信息','您的合同已经冻结!',Exclamation!)
dw_1.reset()
dw_1.insertrow(0)
dw_2.reset()
dw_2.insertrow(0)
cb_dj.enabled = false
return
elseif li_htzt > 2 then
MessageBox('提示信息','您的合同已经结束或中止!',Exclamation!)
dw_1.reset()
dw_1.insertrow(0)
dw_2.reset()
dw_2.insertrow(0)
cb_dj.enabled = false
return
elseif li_htlx = 2 and ldt_sksj > datetime(date(gf_server_date()),time('17:30:00')) then
MessageBox('提示信息','该学员是白天班的学员,请提醒学员按时离校!',Exclamation!)
dw_1.reset()
dw_1.insertrow(0)
dw_2.reset()
dw_2.insertrow(0)
cb_dj.enabled = false
return
else
cb_dj.enabled = true
ldt_dxsj = datetime(date(gf_server_date()),time('00:00:00'))
dw_2.settransobject(sqlca)
gs_string = dw_2.getsqlselect()
gs_select = mid(gs_string,1,pos(upper(gs_string),'WHERE') - 1)
gs_where =  " WHERE ( zy_jw_xxjl.htbh = " + string(ll_htbh) + " ) and ( zy_jw_xxjl.dxsj >= '" + string(ldt_dxsj) + "' ) and ( zy_jw_xxjl.lxsj is null )"
gs_sql = gs_select+gs_where
dw_2.setsqlselect(gs_sql)
li_row2 = dw_2.retrieve()
if li_row2 = 0 or IsNull(li_row2) then
li_row2 = dw_2.insertrow(0)
dw_2.object.jlid[li_row2] = gf_get_max(sqlca,'zy_jw_xxjl',1)
dw_2.object.htbh[li_row2] = ll_htbh
dw_2.object.khid[li_row2] = dw_1.object.khid[li_row1]
dw_2.object.dxsj[li_row2] = ldt_sksj
dw_2.object.dxdjgh[li_row2] = base_info.yhdm
else
ldt_dxsj = dw_2.object.dxsj[li_row2]
ldt_lxsj = ldt_sksj
dw_2.object.lxsj[li_row2] = ldt_lxsj
dw_2.object.lxdjgh[li_row2] = base_info.yhdm
ldc_xxsj = round(secondsafter(time(ldt_dxsj),time(ldt_lxsj))/3600,2)
dw_2.object.xxsj[li_row2] = ldc_xxsj
end if
end if
end event
上面是代码
ldt_dxsj是第一次刷卡

ldt_lxsj是第二次刷卡

ldc_xxsj是2数之差

我需要ldc_xxsj <=5秒 时不写入数据库 或者跳出

我用secondsafter(time(ldt_lxsj),time(ldt_dxsj)) 试过 
但是最后无法写入ldt_lxsj了 一直变成重复刷卡了

#10


最近回复过得帖子,被CSDN给沉了,重新顶起

#11


从2011年7月23日开始,到了每天凌晨,7月22日以后发的帖子和回复的帖子都会 被CSDN恶意的沉掉。每天早上上论坛,帖子列表中能看到的帖子的最后更新日期最晚是7月22日。这无疑让很多提问者的帖子无法被大家浏览,进而无法及时给予解答。

希望  版主:lzp_lrp  能够帮忙反映问题!!!

从“我的社区 → 我回复的帖子”中,可以正常的看到自己回复过的帖子,所以我决定每天手动将我回复过得帖子重新顶起来,希望大家理解并支持我的做法。

希望看到的人,可以帮忙顶一下,毕竟我只能连续 砌三楼

最近回复过的帖子,被 CSDN给沉了,重新顶起