王朝网络
分享
 
 
 

为PB添加dateadd函数

王朝other·作者佚名  2006-12-22
宽屏版  字体: |||超大  

在MIS系统的开发中经常需要计算指定日期相对数量单位前(后)的日期,MSSQLSERVER2000等开发工具提供了可以直接调用的函数,如dateadd,但PB没有提供。不过,通过灵活使用PB提供的RelativeDate函数还是比较容易实现相同功能。

RelativeDate函数要求提供的第一个参数必须为date类型,也即该函数只能处理日期 (不包含时间)运算,因此有关时间部分的运算只能分开执行。以下是f_dateadd函数完整代码,在PB8/9上测试通过。

/*******************************************************************

函数名称:f_dateadd()

参数说明:as_datepart string 日期单位,可取如下值:

year,yyyy,yy,y,年:年;

quarter,qq,季:季;

month,mm,m,月:月;

day,dd,天:天;

week,wk,ww,星期,周:星期;

hour,hh,h,小时:小时

minute,mi,分:分钟;

second,ss,秒:秒;

millisecond,ms,毫秒:毫秒

al_number long 相对数量,取后来日期,为正值, 取前置日期,为负值

adt_refdate datetime 参考日期

返回值: datetime 相对数量单位前(后)的日期

若三个参数中有一个为空,则返回空值,若输入的日期单位非要求的单位也返回空值

功能描述:计算指定日期相对数量单位前(后)的日期

创建人: 康剑民

创建日期:2006-07-27

版本号: V1.0

*******************************************************************/

datetime ldt_return

string ls_sql

any la_values[]

long ll_year,ll_month,ll_day,ll_hour,ll_minute,ll_second,ll_millisecond

long ll_day_tmp,ll_hour_tmp,ll_minute_tmp,ll_second_tmp,ll_millisecond_tmp

date ld_return

time lt_return

//检查参数是否有效

if isnull(as_datepart) or isnull(al_number) or isnull(adt_refdate) then

setnull(ldt_return)

return ldt_return

end if

if al_number = 0 then return adt_refdate

//取各部分时间

ll_year = year(date(adt_refdate))

ll_month = month(date(adt_refdate))

ll_day = day(date(adt_refdate))

ll_hour = hour(time(adt_refdate))

ll_minute = minute(time(adt_refdate))

ll_second = second(time(adt_refdate))

ll_millisecond = long(rightw(string(adt_refdate,'yyyy-mm-dd hh:mm:ss.fff'),3))

//根据不同的日期单位进行计算

choose case lower(as_datepart)

case "year","yyyy","yy","y","年"//年

ll_year = ll_year + al_number

if not isdate(string(ll_year) + "-" + string(ll_month) + "-" + string(ll_day)) then

do while isdate(string(ll_year) + "-" + string(ll_month) + "-" + string(ll_day))

ll_day --

loop

end if

ld_return = date(string(ll_year) + "-" + string(ll_month) + "-" + string(ll_day))

lt_return = time(string(ll_hour,'00')+":"+string(ll_minute,'00')+":"+string(ll_second,'00')+"."+string(ll_millisecond,'000'))

case "quarter","qq","q","季"//季

ll_year = ll_year + long((al_number * 3 + ll_month) / 12) - 1

if mod(al_number * 3 + ll_month,12) = 0 then

ll_month = 12

else

ll_month = mod(al_number * 3 + ll_month,12)

end if

if not isdate(string(ll_year) + "-" + string(ll_month) + "-" + string(ll_day)) then

do while isdate(string(ll_year) + "-" + string(ll_month) + "-" + string(ll_day))

ll_day --

loop

end if

ld_return = date(string(ll_year) + "-" + string(ll_month) + "-" + string(ll_day))

lt_return = time(string(ll_hour,'00')+":"+string(ll_minute,'00')+":"+string(ll_second,'00')+"."+string(ll_millisecond,'000'))

case "month","mm","m","月"//月

if al_number > 0 then

ll_year = ll_year + al_number / 12

else

if mod(abs(al_number),12) = 0 then

ll_year = ll_year + al_number / 12

else

ll_year = ll_year + al_number / 12 + 1

end if

end if

ll_month = ll_month + mod(al_number,12)

if ll_month > 12 then

ll_year = ll_year + 1

ll_month = ll_month - 12

elseif ll_month = 0 then

ll_year = ll_year - 1

ll_month = 12

end if

if not isdate(string(ll_year) + "-" + string(ll_month) + "-" + string(ll_day)) then

do while isdate(string(ll_year) + "-" + string(ll_month) + "-" + string(ll_day))

ll_day --

loop

end if

ld_return = date(string(ll_year) + "-" + string(ll_month) + "-" + string(ll_day))

lt_return = time(string(ll_hour,'00')+":"+string(ll_minute,'00')+":"+string(ll_second,'00')+"."+string(ll_millisecond,'000'))

case "day","dd","d","日"//日

ld_return = relativedate (date(adt_refdate),al_number)

lt_return = time(string(ll_hour,'00')+":"+string(ll_minute,'00')+":"+string(ll_second,'00')+"."+string(ll_millisecond,'000'))

case "week","wk","ww","星期","周"//周

return f_dateadd('day',al_number * 7,adt_refdate)

case "hour","hh","h","小时"//小时

ld_return = relativedate (date(adt_refdate),truncate((al_number + ll_hour) / 24,0))

if al_number > 0 then

ll_hour = mod(al_number + ll_hour,24)

else

ll_hour = 24 - mod(abs(al_number + ll_hour),24)

ld_return = relativedate (ld_return,-1)

end if

lt_return = time(string(ll_hour,'00')+":"+string(ll_minute,'00')+":"+string(ll_second,'00')+"."+string(ll_millisecond,'000'))

case "minute","mi","n","分"//分钟

if ll_hour * 60 + ll_minute + al_number < 0 then

ll_day_tmp = ceiling(abs(ll_hour * 60 + ll_minute + al_number) / 60 / 24) * (-1)

else

ll_day_tmp = (ll_hour * 60 + ll_minute + al_number) / 60 / 24

end if

ld_return = relativedate (date(adt_refdate),ll_day_tmp)

ll_hour_tmp = (ll_hour * 60 + ll_minute + al_number - ll_day_tmp * 24 * 60) / 60

ll_minute = ((ll_hour * 60 + ll_minute + al_number - ll_day_tmp * 24 * 60) / 60 - ll_hour_tmp) * 60

ll_hour = ll_hour_tmp

lt_return = time(string(ll_hour,'00')+":"+string(ll_minute,'00')+":"+string(ll_second,'00')+"."+string(ll_millisecond,'000'))

case "second","ss","s","秒"//秒

if ll_hour * 60 * 60 + ll_minute * 60 + ll_second + al_number < 0 then

ll_day_tmp = ceiling(abs(ll_hour * 60 * 60 + ll_minute * 60 + ll_second + al_number) / 60 / 60 / 24) * (-1)

else

ll_day_tmp = (ll_hour * 60 * 60 + ll_minute * 60 + ll_second + al_number) / 60 / 60 / 24

end if

ld_return = relativedate (date(adt_refdate),ll_day_tmp)

ll_hour_tmp = (ll_hour * 60 * 60 + ll_minute * 60 + ll_second + al_number - ll_day_tmp * 24 * 60 * 60) / 60 / 60

ll_minute_tmp = (ll_hour * 60 * 60 + ll_minute * 60 + ll_second + al_number - ll_day_tmp * 24 * 60 * 60 - ll_hour_tmp * 60 * 60) / 60

ll_second = ll_hour * 60 * 60 + ll_minute * 60 + ll_second + al_number - ll_day_tmp * 24 * 60 * 60 - ll_hour_tmp * 60 * 60 - ll_minute_tmp * 60

ll_hour = ll_hour_tmp

ll_minute = ll_minute_tmp

lt_return = time(string(ll_hour,'00')+":"+string(ll_minute,'00')+":"+string(ll_second,'00')+"."+string(ll_millisecond,'000'))

case "millisecond","ms","毫秒"//毫秒

//先换算成秒计算

if ll_millisecond + al_number < 0 then

ll_second_tmp = ceiling(abs(ll_millisecond + al_number) / 1000) * (-1)

else

ll_second_tmp = (ll_millisecond + al_number) / 1000

end if

ll_millisecond = ll_millisecond + al_number - ll_second_tmp * 1000

if ll_millisecond >= 1000 then

ll_second_tmp = ll_second_tmp + 1

ldt_return = f_dateadd('second',ll_second_tmp,adt_refdate)

ll_millisecond = 1000 - ll_millisecond

else

ldt_return = f_dateadd('second',ll_second_tmp,adt_refdate)

end if

ld_return = date(ldt_return)

ll_hour = hour(time(ldt_return))

ll_minute = minute(time(ldt_return))

ll_second = second(time(ldt_return))

lt_return = time(string(ll_hour,'00')+":"+string(ll_minute,'00')+":"+string(ll_second,'00')+"."+string(ll_millisecond,'000'))

case else//无效参数

setnull(ldt_return)

return ldt_return

end choose

ldt_return = datetime(ld_return,lt_return)

return ldt_return

写作日期:2006-07-27

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有