与MSSQL的dateadd函数功能一致的pb加强版时间函数:f_dateadd

来源:互联网 发布:唐氏筛查 测算软件 编辑:程序博客网 时间:2024/05/18 12:29

        pb中关于datetime的函数,总是把date和time分开来处理,没有针对datetime进行直接增减的函数,在实际使用中限制较大。
        用过MS SQL的程序员,都恨不得能够把MS SQL中的dateadd及datediff函数搬过来用,但是这是不可能的,除非sybase意识到这一点。
        下面这个函数f_dateadd ,可以实现MS SQL的dateadd的所有功能,用法也是一样的(不过,第1个参数必须加上引号)。同时为了兼容pb本身的date类型,该函数还支持参数类型为date的日期的计算。如:f_dateadd( 'hh', 49, 2011-11-04) ,表示计算日期2011-11-04 (默认为0点)的49小时候的日期,函数返回的将是2011-11-06

global function any f_dateadd (string as_type, long ai, any aa_date);//在向指定日期(date或datetime)加上一段时间的基础上,返回新的日期(date或datetime)值(与MSSQL的dateadd函数类似)choose case lower(as_type)case 'hour','hh' //小时return f_dateadd('s', ai * 3600, aa_date)case 'minute','mi','n' //分钟return f_dateadd('s', ai * 60, aa_date)case elseend chooseint li_tlong listring lsdatetime ldtdate ldtime ltboolean lb_date = falseany la_return choose case classname(aa_date)case 'datetime'ldt = aa_dateld = date(ldt)lt = time(ldt)la_return = datetime(blob('1900-01-01 00:00:00'))case 'date'ld = aa_datelt = time('00:00:00')ldt = datetime(ld, lt)la_return = 1900-01-01lb_date = truecase elsereturn datetime(blob('1900-01-01 00:00:00'))end chooseif ai = 0 then goto labelchoose case lower(as_type)case 'year','yy','yyyy' //年份li = year(ld) + aiif li < 1900 or li > 3000 then return la_returnls = string(li) + string(ld, '-mm-dd')case 'quarter','qq','q' //季度li = month(ld) + 3 * aiif mod(li,12) = 0 thenli_t = -1elseli_t = liend ifls = string(year(ld) + int((li -1) / 12)) + string(mod(li, 12) - 6 * (sign(li_t) - 1), '-00') + string(ld, '-dd')case 'month','mm','m' //月份li = month(ld) + ai if mod(li,12) = 0 thenli_t = -1elseli_t = liend ifls = string(year(ld) + int((li -1) / 12)) + string(mod(li, 12) - 6 * (sign(li_t) - 1), '-00') + string(ld, '-dd')case 'day','dd','d' //天数ld = RelativeDate ( ld, ai )goto labelcase 'week','wk','ww' //周数ld = RelativeDate ( ld, ai * 7 )goto labelcase 'hour','hh' //小时case 'minute','mi','n' //分钟case 'second','ss','s' //秒li = int(ai / 86400)choose case SecondsAfter ( time(00:00:00), lt ) + mod(ai , 86400)case is < 0li --case is > 86400li ++end chooseld = f_dateadd('day', li, ld)ls = string(lt, 'fff') //记录毫秒lt = RelativeTime(lt, mod(ai , 86400))lt = time(string(lt, 'hh:mm:ss.') + ls)goto labelcase 'millisecond','ms' //毫秒li = int(ai / 1000)ai = integer(string(lt,'fff')) + mod(ai , 1000)choose case aicase is < 0li --ai = ai + 1000case is > 1000li ++ai = ai - 1000end chooseif lb_date thenreturn f_dateadd('s', li, aa_date)elsereturn f_dateadd('s', li, datetime(ld, time(string(lt, 'hh:mm:ss.') + string(ai))))end ifcase elsereturn aa_dateend chooseif ls = '1900-01-01' then return la_returnld = date(ls)if ld = 1900-01-01 then ld = f_dateadd('dd', -1, f_dateadd('mm', 1, date(left(ls, 8) + '01')))label:if lb_date thenreturn ldelsereturn datetime(ld, lt)end ifend function


 


        在网上搜了一下,发现已经有人写过f_dateadd函数了,大家可以自己看看
        在PB中计算指定日期相对数量单位前(后)的日期

原创粉丝点击