pb中日期加减函数,类似sql的Dateadd函数

来源:互联网 发布:中文输入法下载 linux 编辑:程序博客网 时间:2024/05/22 08:23
  1. //====================================================================
  2. // 函数: f_dateadd()
  3. //--------------------------------------------------------------------
  4. // 描述:用法同sql的dateadd函数
  5. //--------------------------------------------------------------------
  6. // 参数:
  7. //  string      as_datepart 规定应向日期的哪一部分返回新值的参数
  8. //  long        al_number   用来增加 as_datepart 的值
  9. //  datetime    adt_dt      
  10. //--------------------------------------------------------------------
  11. // 返回:  datetime
  12. //--------------------------------------------------------------------
  13. // 作者:  liubocy     日期: 2008年12月25日
  14. //--------------------------------------------------------------------
  15. // 修改:解决用RelativeTime后毫秒归零的问题 2008年12月28日
  16. //====================================================================
  17. Long    ll_SecondTmp, ll_second, i
  18. Int     li_DaysNum
  19. Time    lt_time
  20. Date    ld_date, ld_dateTmp
  21. String ls_Date
  22. Constant Long DAYSECOND = 86400 //一天总共 24 * 3600 = 86400 秒
  23. ld_date = Date(adt_dt)
  24. lt_time = Time(adt_dt)
  25. CHOOSE CASE as_datepart
  26.     CASE "year","yy","yyyy"
  27.         ls_Date = String(year(ld_date) + al_number) + String(ld_date, '-mm-dd')
  28.         IF NOT IsDate(ls_Date) THEN
  29.             ls_Date = String(year(ld_date) + al_number) + String(RelativeDate( ld_date, -1 ), '-mm-dd')
  30.         END IF
  31.         ld_Date = Date(ls_Date)
  32.         RETURN DateTime( ld_date, lt_time )
  33.     CASE "month","mm","m"
  34.         ld_dateTmp = Date(String(ld_date, 'yyyy-mm-') + '01')
  35.         IF al_number < 0 THEN
  36.             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)))
  37.             ld_dateTmp = Date(String(ld_dateTmp, 'yyyy-mm-') + String(li_DaysNum))
  38.         END IF
  39.         FOR i = 1 To abs(al_number)
  40.             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)))
  41.             IF al_number >= 0 THEN
  42.                 ld_dateTmp = RelativeDate( ld_dateTmp, li_DaysNum )
  43.             ELSE
  44.                 ld_dateTmp = RelativeDate( ld_dateTmp, 0 - li_DaysNum )
  45.             END IF
  46.         NEXT
  47.         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)))
  48.         ls_Date = String(ld_dateTmp, 'yyyy-mm-') + String(day(ld_date))
  49.         IF NOT IsDate( ls_Date ) THEN
  50.             ls_Date = String(ld_dateTmp, 'yyyy-mm-') + String(li_DaysNum)
  51.         END IF
  52.         ld_Date = Date(ls_Date)
  53.         RETURN DateTime( ld_date, lt_time )
  54.     CASE "week","wk","ww"
  55.         RETURN DateTime( RelativeDate(ld_date,al_number * 7 ), lt_time )
  56.     CASE "day","d","dd"
  57.         RETURN DateTime( RelativeDate(ld_date,al_number), lt_time )
  58.     CASE "hour","hh"
  59.         ll_SecondTmp = al_number * 3600
  60.     CASE "minute","mi","n"
  61.         ll_SecondTmp = al_number * 60
  62.     CASE "second","ss","s"
  63.         ll_SecondTmp = al_number
  64. END CHOOSE
  65. ll_second = Hour(lt_time) * 3600 + Minute(lt_time) * 60 + Second(lt_time)
  66. ld_date = RelativeDate(ld_date,Integer(ll_SecondTmp/DAYSECOND))
  67. ll_SecondTmp -= Integer(ll_SecondTmp/DAYSECOND) * DAYSECOND
  68. If ( ll_second + ll_SecondTmp < 0 ) THEN    
  69.     //RETURN DateTime(RelativeDate(ld_date,-1),RelativeTime(Time("00:00:00.000"),DAYSECOND + ll_second + ll_SecondTmp))
  70.     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')))
  71. END IF
  72. If ( ll_second + ll_SecondTmp >= DAYSECOND ) THEN
  73.     //RETURN DateTime(RelativeDate(ld_date,1),RelativeTime(Time("00:00:00.000"),ll_second + ll_SecondTmp - DAYSECOND))
  74.     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')))
  75. END IF
  76. //RETURN DateTime( ld_date, RelativeTime( lt_time, ll_SecondTmp ) )
  77. RETURN DateTime( ld_date, Time( String(RelativeTime( lt_time, ll_SecondTmp ), 'hh:mm:ss') + '.' + String(lt_time, 'fff')) )
  78. /*使用: 
  79. DateTime ldt_date
  80. ldt_date = DateTime( Date('2008-12-31'), Time('20:00:00') )
  81. //返回:2008-11-30 20:00:00
  82. ldt_date = f_dateadd('month', -1, ldt_date)
  83. //返回:2009-02-28 20:00:00
  84. ldt_date = f_dateadd('month', 2, ldt_date)
  85. //返回:2010-12-31 20:00:00
  86. ldt_date = f_dateadd('year', 2, ldt_date)
  87. //返回:2009-01-14 20:00:00
  88. ldt_date = f_dateadd('week', 2, ldt_date)
  89. //返回:2009-02-01 20:00:00
  90. ldt_date = f_dateadd('day', 32, ldt_date)
  91. //返回:2009-01-01 02:00:00
  92. ldt_date = f_dateadd('hour', 6, ldt_date)
  93. //返回:2009-01-01 00:00:00
  94. ldt_date = f_dateadd('minute', 240, ldt_date)
  95. //返回:2009-01-01 00:00:00
  96. ldt_date = f_dateadd('second', 240*60, ldt_date)
  97. //返回:2008-02-29 23:59:59.123
  98. ldt_date = DateTime( Date('2008-03-01'), Time('00:00:01.123') )
  99. ldt_date = f_dateadd('ss', -2, ldt_date)
  100. */
原创粉丝点击