祝愿大家身体健康!

 站点注册  找回密码
 站点注册

QQ登录

只需一步,快速开始

查看: 1791|回复: 0

[参考资料] PB PB时间加减函数,支持年月日时分秒的加减。

[复制链接]

[参考资料] PB PB时间加减函数,支持年月日时分秒的加减。

[复制链接]
ehxz

主题

0

回帖

58万

积分

管理员

积分
588431
贡献
在线时间
小时
2023-5-16 22:03:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?站点注册

×
//====================================================================
// Declare: gf_dateadd.
//--------------------------------------------------------------------
// 描述:用法同sql的dateadd函数
//--------------------------------------------------------------------
// 参数:
//  string              as_datepart 规定应向日期的哪一部分返回新值的参数
//  long                al_number   增加值
//  datetime            adt_dt      
//--------------------------------------------------------------------
// 返回:  datetime
//--------------------------------------------------------------------
// 作者:        YJC                日期: 2019/06/23 11:13:24
//--------------------------------------------------------------------
//        CopyRight(c)
//--------------------------------------------------------------------
// 修改历史:
//       
//====================================================================


Long    ll_SecondTmp, ll_second, i
Int     li_DaysNum
Time    lt_time
Date    ld_date, ld_dateTmp
String         ls_Date
Constant Long DAYSECOND = 86400 //一天总共 24 * 3600 = 86400 秒

ld_date = Date(adt_dt)
lt_time = Time(adt_dt)

CHOOSE CASE as_datepart
    CASE "year","yy","yyyy"
        ls_Date = String(year(ld_date) + al_number) + String(ld_date, '-mm-dd')
        IF NOT IsDate(ls_Date) THEN
            ls_Date = String(year(ld_date) + al_number) + String(RelativeDate( ld_date, -1 ), '-mm-dd')
        END IF
        ld_Date = Date(ls_Date)
        RETURN DateTime( ld_date, lt_time )
    CASE "month","mm","m"
        ld_dateTmp = Date(String(ld_date, 'yyyy-mm-') + '01')
        IF al_number < 0 THEN
            li_DaysNum = Integer(28+Integer(Mid('3'+String(Abs(Sign(Mod(Sign(Mod(Abs(Year(ld_dateTmp)),4))+Sign(Mod(Abs(Year(ld_dateTmp)),100))+Sign(Mod(Abs(Year(ld_dateTmp)),400)),2)) -1))+'3232332323',Month(ld_dateTmp),1)))
            ld_dateTmp = Date(String(ld_dateTmp, 'yyyy-mm-') + String(li_DaysNum))
        END IF
        FOR i = 1 To abs(al_number)
            li_DaysNum = Integer(28+Integer(Mid('3'+String(Abs(Sign(Mod(Sign(Mod(Abs(Year(ld_dateTmp)),4))+Sign(Mod(Abs(Year(ld_dateTmp)),100))+Sign(Mod(Abs(Year(ld_dateTmp)),400)),2)) -1))+'3232332323',Month(ld_dateTmp),1)))
            IF al_number >= 0 THEN
                ld_dateTmp = RelativeDate( ld_dateTmp, li_DaysNum )
            ELSE
                ld_dateTmp = RelativeDate( ld_dateTmp, 0 - li_DaysNum )
            END IF
        NEXT
        li_DaysNum = Integer(28+Integer(Mid('3'+String(Abs(Sign(Mod(Sign(Mod(Abs(Year(ld_dateTmp)),4))+Sign(Mod(Abs(Year(ld_dateTmp)),100))+Sign(Mod(Abs(Year(ld_dateTmp)),400)),2)) -1))+'3232332323',Month(ld_dateTmp),1)))
        ls_Date = String(ld_dateTmp, 'yyyy-mm-') + String(day(ld_date))
        IF NOT IsDate( ls_Date ) THEN
            ls_Date = String(ld_dateTmp, 'yyyy-mm-') + String(li_DaysNum)
        END IF
        ld_Date = Date(ls_Date)
        RETURN DateTime( ld_date, lt_time )
    CASE "week","wk","ww"
        RETURN DateTime( RelativeDate(ld_date,al_number * 7 ), lt_time )
    CASE "day","d","dd"
        RETURN DateTime( RelativeDate(ld_date,al_number), lt_time )
    CASE "hour","hh"
        ll_SecondTmp = al_number * 3600
    CASE "minute","mi","n"
        ll_SecondTmp = al_number * 60
    CASE "second","ss","s"
        ll_SecondTmp = al_number
END CHOOSE

ll_second = Hour(lt_time) * 3600 + Minute(lt_time) * 60 + Second(lt_time)

ld_date = RelativeDate(ld_date,Integer(ll_SecondTmp/DAYSECOND))
ll_SecondTmp -= Integer(ll_SecondTmp/DAYSECOND) * DAYSECOND

If ( ll_second + ll_SecondTmp < 0 ) THEN     
    //RETURN DateTime(RelativeDate(ld_date,-1),RelativeTime(Time("00:00:00.000"),DAYSECOND + ll_second + ll_SecondTmp))
    RETURN DateTime(RelativeDate(ld_date,-1),   Time( String(RelativeTime(Time("00:00:00"), DAYSECOND + ll_second + ll_SecondTmp), 'hh:mm:ss') + '.' + String(lt_time, 'fff')))
END IF

If ( ll_second + ll_SecondTmp >= DAYSECOND ) THEN
    //RETURN DateTime(RelativeDate(ld_date,1),RelativeTime(Time("00:00:00.000"),ll_second + ll_SecondTmp - DAYSECOND))
    RETURN DateTime(RelativeDate(ld_date,1), Time( String(RelativeTime(Time("00:00:00"), ll_second + ll_SecondTmp - DAYSECOND), 'hh:mm:ss') + '.' + String(lt_time, 'fff')))
END IF

        //RETURN DateTime( ld_date, RelativeTime( lt_time, ll_SecondTmp ) )
RETURN DateTime( ld_date, Time( String(RelativeTime( lt_time, ll_SecondTmp ), 'hh:mm:ss') + '.' + String(lt_time, 'fff')) )



共享共进共赢Sharing And Win-win Results
SYBASEBBS - 免责申明1、欢迎访问“SYBASEBBS.COM”,本文内容及相关资源来源于网络,版权归版权方所有!本站原创内容版权归本站所有,请勿转载!
2、本文内容仅代表作者观点,不代表本站立场,作者自负,本站资源仅供学习研究,请勿非法使用,否则后果自负!请下载后24小时内删除!
3、本文内容,包括但不限于源码、文字、图片等,仅供参考。本站不对其安全性,正确性等作出保证。但本站会尽量审核会员发表的内容。
4、如本帖侵犯到任何版权问题,请立即告知本站 ,本站将及时删除并致以最深的歉意!客服邮箱:admin@sybasebbs.com
您需要登录后才可以回帖 登录 | 站点注册

本版积分规则

免责声明:
本站所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:Admin@SybaseBbs.com

QQ|Archiver|PowerBuilder(PB)BBS社区 ( 鲁ICP备2021027222号-1 )

GMT+8, 2024-11-21 20:42 , Processed in 0.118898 second(s), 8 queries , MemCached On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表