一十三条用一条语句写成的有关日期函数
可以直接赋值给变量,不用写成函数形式的。另函数适用于pb6.5,一个汉字占两个字节,如果用于pb8.0以上请根据实际情况修改; X9 A2 M) Q* j+ F3 h: A# Y' j
- n) ^% F' f5 h. B- C//1.生肖(年份参数:int ls_year 返回参数:string):& l- M+ K! q2 m2 h M& S4 w
mid(fill('鼠牛虎兔龙蛇马羊猴鸡狗猪',48),(mod(ls_year -1900,12)+13)*2 -1,2)
: }. X3 K6 F* Q2 L. y) T) l8 K! O; Q8 z9 {$ {
//2.天干地支(年份参数:int ls_year 返回参数:string):4 C( o3 @ i1 H5 L* L( o
mid(fill('甲乙丙丁戊己庚辛壬癸',40),(mod(ls_year -1924,10)+11)*2 -1,2)+mid(fill('子丑寅卯辰巳午未申酉戌亥',48),(mod(ls_year -1924,12)+13)*2 -1,2)
8 }2 r/ \2 F+ U7 N/ u. d
( ^# U* e5 Y+ h+ F//3.星座(日期参数:date ls_date 返回参数:string):3 n( K% P% z# Q% m9 l% U% f+ n
mid("摩羯水瓶双鱼白羊金牛双子巨蟹狮子处女天秤天蝎射手摩羯",(month(ls_date)+sign(sign(day(ls_date) -(19+integer(mid('102123444423',month(ls_date),1))))+1))*4 -3,4)+'座'( u2 ^6 x- ]3 Q( J
" j# f/ ]/ M2 L
//4.判断闰年(年份参数:int ls_year 返回参数:int 0=平年,1=闰年):! p& C% L& }/ K7 ~& m
abs(sign(mod(sign(mod(abs(ls_year),4))+sign(mod(abs(ls_year),100))+sign(mod(abs(ls_year),400)),2)) -1)" w) `5 o7 `# o# b8 n2 B: x% r
: a; m" q6 J) _1 ]% F
//5.某月天数(日期参数:date ls_date 返回参数:int):
5 w+ f2 B$ T r9 s) minteger(28+integer(mid('3'+string(abs(sign(mod(sign(mod(abs(year(ls_date)),4))+sign(mod(abs(year(ls_date)),100))+sign(mod(abs(year(ls_date)),400)),2)) -1))+'3232332323',month(ls_date),1)))
, z# g* z$ F6 O. s9 w* w# Z/ W1 K
//6.某月最后一天日期(日期参数:date ls_date 返回参数:date):; }( M6 L) W' H
date(year(ls_date),month(ls_date),integer(28+integer(mid('3'+string(abs(sign(mod(sign(mod(abs(year(ls_date)),4))+sign(mod(abs(year(ls_date)),100))+sign(mod(abs(year(ls_date)),400)),2)) -1))+'3232332323',month(ls_date),1)))) S9 i/ Y2 ~' W( ^
' m0 Q) B4 C6 X+ j' n4 \ D; q
//7.另一个求某月最后一天日期(日期参数:date ls_date 返回参数:date): n/ E( _8 N, j/ F, T: G+ B
a.
7 U" E/ k* G1 ]RelativeDate (date(year(ls_date)+sign(month(ls_date) -12)+1,mod(month(ls_date)+1,13)+abs(sign(mod(month(ls_date)+1,13)) -1),1),-1)
5 w8 q7 M* G* j, U# x' db.% G: J4 j/ C6 @* G6 P+ G0 _
RelativeDate(date(year(ls_date)+integer(month(ls_date)/12),mod(month(ls_date),12)+1,1),-1)8 Z4 ?3 D9 s4 t- M& @
! o8 [0 X! u' e. {" `//8.另一个求某月天数(日期参数:date ls_date 返回参数:int):
6 w! P2 `8 L( O* T9 V7 V& `% Ua.
& T; a; a# C+ a8 A. zday(RelativeDate (date(year(ls_date)+sign(month(ls_date) -12)+1,mod(month(ls_date)+1,13)+abs(sign(mod(month(ls_date)+1,13)) -1),1),-1)) K+ {5 `% [' q
b.$ T! f( t [' k5 O7 n/ O. k% a/ q
day(RelativeDate(date(year(ls_date)+integer(month(ls_date)/12),mod(month(ls_date),12)+1,1),-1))3 L! w' c2 X" m& X2 p( P
: w0 V5 X* i/ J
//9.某月某日星期几--同PB系统函数DayName(日期参数:date ls_date 返回参数:string):( W8 j P- D) k9 Z+ m
'星期'+mid('日一二三四五六',(mod(year(ls_date) -1 + int((year(ls_date) -1)/4) - int((year(ls_date) -1)/100) + int((year(ls_date) -1)/400) + daysafter(date(year(ls_date),1,1),ls_date)+1,7)+1)*2 -1,2): F% R- d7 U2 f8 }2 Z; p; r
5 q8 B4 G0 X0 l& _8 a8 ^0 w- E- P- Z
//10.求相隔若干月份后的相对日期(日期参数:date ls_date 相隔月份(可取负数):int ls_add_month 返回参数:date):
6 t6 Z; x! C+ X, ^( Ldate(year(ls_date)+int((month(ls_date)+ls_add_month)/13),long(mid(fill('010203040506070809101112',48),(mod(month(ls_date)+ls_add_month -1,12)+13)*2 -1,2)),day(ls_date) -integer(right(left(string(day(RelativeDate (date(year(ls_date)+int((month(ls_date)+ls_add_month)/13)+sign(long(mid(fill('010203040506070809101112',48),(mod(month(ls_date)+ls_add_month -1,12)+13)*2 -1,2)) -12)+1,mod(long(mid(fill('010203040506070809101112',48),(mod(month(ls_date)+ls_add_month -1,12)+13)*2 -1,2))+1,13)+abs(sign(mod(long(mid(fill('010203040506070809101112',48),(mod(month(ls_date)+ls_add_month -1,12)+13)*2 -1,2))+1,13)) -1),1),-1)) -day(ls_date),'00')+'00000',5),3))/100)+ H; y$ P$ C) W6 V
- A6 r' k3 w+ J- m; H2 j2 X0 e) ]//11.求某日在当年所处的周数(日期参数:date ls_date 返回参数:int):- d) X1 d2 l( H, \* b& N4 A" V; J+ p
//a.周始日为星期天
2 ]$ o1 J* `8 t, K//a11 }( X( v! M1 A
abs(int(-((daysafter( RelativeDate(date(year(ls_date),1,1), -mod(year(ls_date) -1 + int((year(ls_date) -1)/4) - int((year(ls_date) -1)/100) + int((year(ls_date) -1)/400) + 1,7) +1),ls_date)+1)/7)))8 n; S d2 T8 E
//a2(使用DayNumber函数)+ ]+ w# w0 Y! L) I& N1 B- G8 K' Y1 s; V
abs(int(-((daysafter( RelativeDate(date(year(ls_date),1,1), -DayNumber(date(year(ls_date),1,1))+1),ls_date)+1)/7)))
# N. a' f1 Z3 r( c, Q
, m! M' j6 }9 x4 Y+ m' r//b.周始日为星期一
7 G, u$ {0 K9 c' r! m//b1
1 n4 }0 z; A$ f2 ~8 H) d: t1 `abs(int(-((daysafter( RelativeDate(date(year(ls_date),1,1), -integer(mid('6012345',mod(year(ls_date) -1 + int((year(ls_date) -1)/4) - int((year(ls_date) -1)/100) + int((year(ls_date) -1)/400) + 1,7),1))),ls_date)+1)/7)))
6 z, [2 d. ^! d6 E( K6 V) |; l//b2(使用DayNumber函数)" g7 A- d2 J3 z1 e- z7 ^2 h
abs(int(-((daysafter( RelativeDate(date(year(ls_date),1,1), -integer(mid('6012345',DayNumber(date(year(ls_date),1,1)),1))),ls_date)+1)/7)))0 p1 U' O! l( U
1 A6 `2 [5 R7 R8 W2 d7 o
//12.求某日相对于过去某一日期所处的周数(日期参数:date ls_date_1(要求的某日),ls_date_2(过去的某日) 返回参数:int):
0 f9 ~9 b: a V5 I6 k//注:ls_date_1>ls_date_22 r+ @; A& h/ o; ]5 N& T
//a.周始日为星期天
/ x7 s: T% A% v5 h' C//a17 [1 {7 W8 [2 h; e0 ~0 i/ O+ t. \
abs(int(-((daysafter( RelativeDate(ls_date_2, -mod(year(ls_date_2) -1 + int((year(ls_date_2) -1)/4) - int((year(ls_date_2) -1)/100) + int((year(ls_date_2) -1)/400) + daysafter(date(year(ls_date_2),1,1),ls_date_2)+ 1,7) +1),ls_date_1)+1)/7)))9 }1 U# I" g- y( N+ t
//a2(使用DayNumber函数)
$ k; X) b; R: c$ c4 Z' Jabs(int(-((daysafter( RelativeDate(ls_date_2, -DayNumber(ls_date_2)+1),ls_date_1)+1)/7)))( o1 E- ]5 d, z8 J1 |" G2 x x
. i' B9 M2 C" v' b//b.周始日为星期一
5 ]2 f+ [- p! I) T8 U//b1$ Y) {. `+ J4 L* Y7 |0 O
abs(int(-((daysafter( RelativeDate(ls_date_2, -integer(mid('6012345',mod(year(ls_date_2) -1 + int((year(ls_date_2) -1)/4) - int((year(ls_date_2) -1)/100) + int((year(ls_date_2) -1)/400) + daysafter(date(year(ls_date_2),1,1),ls_date_2)+ 1,7) ,1))),ls_date_1)+1)/7)))" ~ H0 @2 s/ k3 C% }
//b2(使用DayNumber函数)
+ ^$ S4 |$ M3 zabs(int(-((daysafter( RelativeDate(ls_date_2, -integer(mid('6012345',DayNumber(ls_date_2),1))),ls_date_1)+1)/7))). t$ l4 n4 m( ^' s( t& X0 O
; n; c6 t5 h8 p3 U& D0 V% i以上转贴,以下补充,欢迎大家一起来补充 昕晨 2004.6
1 \ R5 f' `7 M: ~% ^5 M, c9 t8 E. v8 r' Y
13 PB中 DaysAfter ( date1, date2 ) 只能返回日期类型相差天数,SecondsAfter ( time1, time2 )只能返回时间相差妙,没有真对日期时间类型的函数,可以用下面一条语句实现:( x) P( Z5 v7 X$ ~. y5 V" P
: j1 P& H- W6 t! [/ a9 Llont ll_allseconds5 Q. Z! W) e7 x7 A3 X( r
# ~! f) U% Z u8 _; W
datetime ldt_bgn,ldt_end. _$ r: e+ C4 z2 u
% W7 E: G- c [: x/ i1 qll_allseconds=(daysafter(date(ldt_bgn),date(ldt_end))*86400+SecondsAfter(time(ldt_bgn),time(ldt_end)))6 o% M0 Q4 U, W3 {, E
2 u: F- @' u4 j9 k$ A8 ]
//返回两个DATETIME相差妙,如果要得到相差分钟,就 除以60就行,得到小时类似。
8 r2 N# w( [1 W* J0 D0 W
1 z7 @6 }, J* ]) U3 J) K14.上面对于当他所在的周,所在的月等处理很麻烦,我这里提供几个语句供大家参考:
2 f5 ~* z; D8 Y9 R. c
6 M. U- n) s( c" V e# S, S+ n0 l* {! O字段说明:Dv_bbs1 为表名,username 为发贴用户名(字符型),dateandtime 为发贴时间(日期时间型)。数据库为 SQL SERVER 2000- F: o$ a4 e, R3 |/ }* B2 M& X
: p1 D5 n9 Q1 y ^
复杂方法:
+ X5 i+ Z @2 w0 `! H |6 L# F' x/ e8 q( F) I) p/ W% _4 F
今日发贴排名8 F! l; s9 c! q2 w8 k$ _) y* T
6 y1 X! L" n7 Y! _4 U2 \% Tselect top 10 username,count(username) from Dv_bbs1 where CONVERT(char(10),dateandtime) = CONVERT(char(10),getdate()) group by username order by count(username) desc$ J! b% l) D, q$ F: g
q7 D" P- A, p昨日发贴排名
" ]$ n1 X3 M2 j( i2 ?* @. ]+ o$ G4 Y$ `0 U# N
select top 10 username,count(username) from Dv_bbs1 where CONVERT(char(10),dateandtime) = CONVERT(char(10),dateadd(day,-1,GetDate())) group by username order by count(username) desc
5 C$ ~, r4 b# R6 k, R r( U+ k- Z
本周发贴排名
5 G5 J1 |/ p. \/ @! L1 p, ~
+ V: W. S# X+ pselect top 10 username,count(username) from Dv_bbs1 where CONVERT(char(10),dateandtime) >= CONVERT(char(10),dateadd(day,2 - DATEPART(dw, GETDATE()),GetDate())) and CONVERT(char(10),dateandtime)= convert(datetime,CONVERT(char(2),getdate())+' 01 '+CONVERT(char(4),year(getdate())) ) group by username order by count(username) desc + O$ @4 K4 e M2 c1 _
$ U J7 c+ u' E( o4 u
发贴总排名
0 D1 j5 t, V6 [) X
0 T' I4 W0 k/ H# z$ j& W" jselect top 10 username,count(username) from Dv_bbs1 group by username order by count(username) desc, ^+ { v# R' g% ` f% \) Z5 L" `0 ]
% @6 c8 ` |3 k: ~
简单语句:# ]8 b/ k9 a7 V! h
; l( a5 w* |4 {. F2 q4 `今日发贴排名2 w8 E1 D2 { ]6 q
) y( w0 T1 h) ~
select top 10 username,count(username) from Dv_bbs1 where datepart(y,dateandtime)=datepart(y,getdate()) and boardid = 85 group by username order by count(username) desc
9 i, F7 j: h& v2 D j2 \; x% w# ~5 L4 G& _
昨日发贴排名
5 q! b" I* Y/ b+ E- t, [! T% G% t8 `5 R. R: h
select top 10 username,count(username) from Dv_bbs1 where datepart(y,dateandtime)=datepart(y,getdate()-1) and boardid = 85 group by username order by count(username) desc @" u( {$ [$ E, \- d
S& q! a& V9 }/ U, J- Q. u/ P6 E本周发贴排名
( J- c/ k8 D1 ?/ h8 k3 v" _) L1 y( i7 c- Q$ R2 J
select top 10 username,count(username) from Dv_bbs1 where datepart(ww,dateandtime)=datepart(ww,getdate()) and boardid = 85 group by username order by count(username) desc2 J( y6 E2 r; t$ U
* I: i) r! M u; ]7 J0 n, t: X5 t" g# A- o
本月发贴排名
$ O2 I1 X7 b; ?+ b: P
0 M5 w+ w3 U: @( r+ n: ~: u+ q! wselect top 10 username,count(username) from Dv_bbs1 where datepart(m,dateandtime)=datepart(m,getdate()) and boardid = 85 group by username order by count(username) desc
- W" v2 _" N: s; S' g: V; ^( _, }
其中本周排名是以星期天为第一天,假如要以星期一为第一天就是5 l" s p/ V' T2 c5 j7 H# K
select top 10 username,count(username) from Dv_bbs1 where datepart(ww,dateandtime-1)=datepart(ww,getdate() - 1) and boardid = 85 group by username order by count(username) desc