祝愿大家身体健康!

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

QQ登录

只需一步,快速开始

查看: 4784|回复: 0

网友很好用的日期函数

[复制链接]

网友很好用的日期函数

[复制链接]
opet777

主题

0

回帖

436

积分

中级会员

积分
436
贡献
在线时间
小时
2012-2-22 09:56:45 | 显示全部楼层 |阅读模式

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

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

×
//函数名称: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
//*******************************************************************/
//====================================================================
// 事件: .f_dateadd()
//--------------------------------------------------------------------
// 描述:
//--------------------------------------------------------------------
// 参数:
//  value string   as_datepart
//  value long     al_number   
//  value datetime adt_refdate
//--------------------------------------------------------------------
// 返回:  datetime
//====================================================================


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

共享共进共赢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-22 00:47 , Processed in 0.034679 second(s), 7 queries , MemCached On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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