通过灵活使用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

在PB中计算指定日期相对数量单位前(后)的日期相关推荐

  1. Shell 获取指定日期 N 天/月/年前(后)的日期

    0 前 言 我们有时候在写批处理 Shell 脚本时,可能需要获取指定日期前(后) N 天/月/年的日期,这里的 N 可以是 1 天/月/年.2 天/月/年.3 天/月/年等等.方法其实很简单,这里做 ...

  2. mysql查询员工表中所有员工入职20个月之后的日期_Mysql基础教程

    往期推荐 2020黑马Python教程 Docker基础知识 网易云课堂2019 Java高级教程 郭术生AE教程 SQL语句分类 DDL:数据定义语言,用来定义数据库对象:库.表.列等 DML:数据 ...

  3. CAD教程:CAD软件中计算面积时如何转换单位?

    在使用CAD建筑软件绘制图纸的时候,很多设计师都会用毫米来做单位,但是在进行房间面积计算的时候又希望用米来做单位,这样就需要涉及到单位转换的问题.很多CAD制图初学入门者都很想知道怎么才能快速CAD面 ...

  4. js中计算一个时间点加上一个时间段后的时间

    在实际的项目中,我们常常有这样的需求,计算某个时间点加上某个时间段后(几天几小时几分钟)的时间.如: 2016-04-05 09:29:15 要加上2天4小时5分钟后的时间: 即:2016-04-07 ...

  5. 日是这一年的等几天Java代码_java中计算指定日期是一年的第几天的方法

    Java输入日期计算是这年的第几天: 思路 通过年份区分出是闰年还是平年,平年 2 月 28 天,闰年 2 月 29 天: 1.3.5.7.8.10.12 月份 31 天其余月份均为 30 天: 然后 ...

  6. java 一年中的第几天_java中计算指定日期是一年的第几天的方法

    Java输入日期计算是这年的第几天: 思路 通过年份区分出是闰年还是平年,平年 2 月 28 天,闰年 2 月 29 天: 1.3.5.7.8.10.12 月份 31 天其余月份均为 30 天: 然后 ...

  7. shell计算指定时间的N分钟前

    用时间戳 # date -d '2018-08-27 10:00:00' +%s 1535335200 然后在加上N分钟 _plus=`expr $N * 60` 然后再减去 result=`expr ...

  8. 单元格等于计算机日期,《excel表格怎样自动填写日期》 Excel单元格中自动获取当前日期与时间...

    在excel里如何在单元格内用快捷键使之显示当前日期或时间 Ctrl : 当前日期Ctrl Shift : 当前时间 EXCEL表格中只显示日期不要显示时间 右击"单元格格式"设置 ...

  9. php获取本月工作日,ThinkPHP中获取指定日期后工作日的具体日期方法

    ThinkPHP中获取指定日期后工作日的具体日期方法 来源:中文源码网    浏览: 次    日期:2019年11月5日 [下载文档:  ThinkPHP中获取指定日期后工作日的具体日期方法.txt ...

  10. 【SQL开发实战技巧】系列(二十一):数据仓库中时间类型操作(进阶)识别重叠的日期范围,按指定10分钟时间间隔汇总数据

    系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...

最新文章

  1. 2022-2028年中国塑料编织品的制造行业市场竞争态势及投资方向分析报告
  2. 每日一皮:当我修复一个隐藏Bug时,陷入了死循环中....
  3. Android 手机影音 开发过程记录(六)
  4. 安徽省2019年普通高校招生文史、理工类最低控制分数线一览表
  5. 多媒体个人计算机能处理什么,多媒体计算机可以处理的信息类型有哪些
  6. 【Qt】水平和垂直布局
  7. 游戏编程入门之绘制动画的精灵(爆炸特效)
  8. History of pruning algorithm development and python implementation(finished)
  9. C# 读写Ini文件
  10. channelsftp 上传文件为空_SpringBoot文件上传下载篇(九)
  11. 三议(巧用:before和inline-block伪元素解决)跨浏览器不定长宽,中心为基点,百分比定位~...
  12. ROS系列之初识gmapping
  13. Java中Collection接口
  14. 诺基亚5800软件测试初学者,诺基亚5800刷机【教程详解】
  15. Linux中压缩文件后生成,在 Linux系统中,压缩文件后生成后缀为.gz文件的命令是 gzip 。...
  16. 用python写1加到100怎么写_python计算1到100的和
  17. 零基础零起步,三周带你重塑《钢铁侠》之路
  18. 【C#】分享一个可携带附加消息的增强消息框MessageBoxEx
  19. 深度学习巨头—杨立昆
  20. 蓝海彤翔执行副总裁张加廷接受【联播苏州】独家专访

热门文章

  1. 笔记本电脑连接wifi后突然上不了网解决方法汇总
  2. 技术管理之巅-如何从零打造高质效互联网技术团队?
  3. AI产业新阶段:高效的数据管理,正在实现AI数据价值最大化
  4. chm文件导入java_java API的chm文件制作
  5. 小米 2015 北京 研发面试
  6. 深度解析《ETC行业领军企业成谷科技》
  7. GOlang将华氏温度转换为摄氏温度的函数
  8. 奇异值分解(SVD)
  9. JavaScript制作网页动画
  10. 企业微信和钉钉的区别以及企业微信的功能