ehxz 发表于 2023-5-16 22:03:45

PB PB时间加减函数,支持年月日时分秒的加减。

//====================================================================
// 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')) )



页: [1]
查看完整版本: PB PB时间加减函数,支持年月日时分秒的加减。

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

Mail To:Admin@SybaseBbs.com