一十三条用一条语句写成的有关日期函数
[size=3]可以直接赋值给变量,不用写成函数形式的。另函数适用于pb6.5,一个汉字占两个字节,如果用于pb8.0以上请根据实际情况修改7]0q k |w*T.{
z+FvRbUIaa
//1.生肖(年份参数:int ls_year 返回参数:string):
&sW"g"Z\ O7{(Bd mid(fill('鼠牛虎兔龙蛇马羊猴鸡狗猪',48),(mod(ls_year -1900,12)+13)*2 -1,2)k p-Dhl+aP
"{rK Y.D)A%E/mG8^!d
//2.天干地支(年份参数:int ls_year 返回参数:string):
U%vWPZpzA:L mid(fill('甲乙丙丁戊己庚辛壬癸',40),(mod(ls_year -1924,10)+11)*2 -1,2)+mid(fill('子丑寅卯辰巳午未申酉戌亥',48),(mod(ls_year -1924,12)+13)*2 -1,2)1b2F:L [&f-U| X.hV[
|`Z){5~)X //3.星座(日期参数:date ls_date 返回参数:string):
~:['A W)l)M6| ZR*@5s s mid("摩羯水瓶双鱼白羊金牛双子巨蟹狮子处女天秤天蝎射手摩羯",(month(ls_date)+sign(sign(day(ls_date) -(19+integer(mid('102123444423',month(ls_date),1))))+1))*4 -3,4)+'座'
7fPj;b{:Tj;o+Y
;PN?i5dz //4.判断闰年(年份参数:int ls_year 返回参数:int 0=平年,1=闰年):
ns@ V/e!\&}1|%H:I abs(sign(mod(sign(mod(abs(ls_year),4))+sign(mod(abs(ls_year),100))+sign(mod(abs(ls_year),400)),2)) -1)
_l`V_(B8M,t.Wy1@
:AB1|H$o&t Hpy //5.某月天数(日期参数:date ls_date 返回参数:int):
8? PH'L0a 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))),Y)MUtj&E6z3au nk ?
%xG[5@"TH(f`ji
//6.某月最后一天日期(日期参数:date ls_date 返回参数:date):w[ P9^ xAO8m6E`&o
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))))F,q*i,W[!N
,y2O3Z;`L'EqT xE
//7.另一个求某月最后一天日期(日期参数:date ls_date 返回参数:date):Y n#ob wX/e
a..N/T}+f:w8tB
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)
sK,x ?N%o.~2nO b.
@w-?` k C RelativeDate(date(year(ls_date)+integer(month(ls_date)/12),mod(month(ls_date),12)+1,1),-1)
6a \,\+CYZ6g 4@-w6aQg^8O:h
//8.另一个求某月天数(日期参数:date ls_date 返回参数:int):
oF5h4v ?jz a.8w^E6H!v[d
day(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))@-t SLS*B0C
b.
N6o+M(ehl ]V+B"T day(RelativeDate(date(year(ls_date)+integer(month(ls_date)/12),mod(month(ls_date),12)+1,1),-1))
0]$s6t z:U
Y'c)V*b)h2? //9.某月某日星期几--同PB系统函数DayName(日期参数:date ls_date 返回参数:string):
!UKHaa!PI '星期'+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)%H2@;U"X+`1gd}
/Fh r Sr P"A*[ //10.求相隔若干月份后的相对日期(日期参数:date ls_date 相隔月份(可取负数):int ls_add_month 返回参数:date):
O ok {.~UY date(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)TX)MmV5G9iA
0Ra m O*Vmtm&xA
//11.求某日在当年所处的周数(日期参数:date ls_date 返回参数:int):
3j[!x ??dd/]L'} //a.周始日为星期天
k.\isZCL ik //a1 _&X_OH B!vHP
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)))
8Rle/nK,p //a2(使用DayNumber函数)
xi2_J&C&gE2_P abs(int(-((daysafter( RelativeDate(date(year(ls_date),1,1), -DayNumber(date(year(ls_date),1,1))+1),ls_date)+1)/7)))5p$}T@%RPm
YV9hAf3WV2dU TxK*H //b.周始日为星期一[E4TC'Yy;qm
//b1'Lg%[mA:|
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)))
\a6t!i,\#{0e //b2(使用DayNumber函数)pj3@8\/E,\
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)))
\8g-QS7vH7Br3I\.y
J%]1@ Z"l$^'N*F O //12.求某日相对于过去某一日期所处的周数(日期参数:date ls_date_1(要求的某日),ls_date_2(过去的某日) 返回参数:int):
.H h~1l a.`'c //注:ls_date_1>ls_date_2
qN,]$`xr //a.周始日为星期天
8lG4|sOU-S //a1p;it;CvBL
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)))
#~:i]%f\.I //a2(使用DayNumber函数)
4gscP1~5OsV abs(int(-((daysafter( RelativeDate(ls_date_2, -DayNumber(ls_date_2)+1),ls_date_1)+1)/7)))faH.I3@S/_!u
J7BpE2SH //b.周始日为星期一
GZpH7Fv //b1
`P kA"uL(S'~ 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))),O)i$x5WG-h
//b2(使用DayNumber函数) v6wXP*]-KL
abs(int(-((daysafter( RelativeDate(ls_date_2, -integer(mid('6012345',DayNumber(ls_date_2),1))),ls_date_1)+1)/7)))
K,dA~ A#Kn {
$LnG5i.ZH 以上转贴,以下补充,欢迎大家一起来补充 昕晨 2004.66I%r8R_E&`@!V
7Xh)[HGm D
13 PB中 DaysAfter ( date1, date2 ) 只能返回日期类型相差天数,SecondsAfter ( time1, time2 )只能返回时间相差妙,没有真对日期时间类型的函数,可以用下面一条语句实现:
_JL1Jx
{ wCo3qSruM lont ll_allseconds
9Yl3G?Q bM&FmK's$?J
datetime ldt_bgn,ldt_end
jZ!Q2~Ov ;P;Ht+| g-_
ll_allseconds=(daysafter(date(ldt_bgn),date(ldt_end))*86400+SecondsAfter(time(ldt_bgn),time(ldt_end)))$I"pDV"@d
k H(UQW(Q(NoD9lXnc
//返回两个DATETIME相差妙,如果要得到相差分钟,就 除以60就行,得到小时类似。
Ct:L&xF Yz"^
@ wC)YWO/c{Y 14.上面对于当他所在的周,所在的月等处理很麻烦,我这里提供几个语句供大家参考:
5R#NNk;d]2PV
6UD2E*n;mx)n$yv 字段说明:Dv_bbs1 为表名,username 为发贴用户名(字符型),dateandtime 为发贴时间(日期时间型)。数据库为 SQL SERVER 2000R `D {sM$L6I/\%S
H7[5HC;_\7K"B 复杂方法:
e,d-m4[1iP1k&p ~8I R ?g
今日发贴排名,A'W2{Hi~ cJ `
fI5Ca-z4?Z
select top 10 username,count(username) from Dv_bbs1 where CONVERT(char(10),dateandtime) = CONVERT(char(10),getdate()) group by username order by count(username) desca:s5ZJ;p)e7m/[1\
:I{u|]!I bS.T
昨日发贴排名
&dl)VWrf df$GE3Q#Xl
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) desc9MW]H3h?;x3WZ
'qh+[Db/_yZ;n;j
本周发贴排名
RJ+B(I0qd2H;S7tzF
*V7g#V4Vs2[ VJ#T7m select 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 (xI Y W!faNB
i8v:@,D c
发贴总排名
W Z/t\*k*w,mJ~3a %`x)x,[ re6v"] t @0@zX
select top 10 username,count(username) from Dv_bbs1 group by username order by count(username) desc7d%j~\%t(@9K*C#R"z#|1o'P
b)@|I qq
简单语句:;iOuk"d;s*^X#w
l8k,h t&KOM 今日发贴排名
t8D3x/K5[w6W4X ({)A,p ["t
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
xsyjG:R;q} /`/ke"c'^
昨日发贴排名/t'V5u5Wv.f
tdPYBBbV
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
|1}-lyS,Yh1s
YWo9n YNJ 本周发贴排名 `ay |"kl
f4`U DR 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) desco^p H#{,O]z
j!w2c5b4I)X.AH
本月发贴排名
A,~(L!@0V/j
9},aTj)Oce select 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
,RZ G!jv^ *L5hZ uJ-o+d
其中本周排名是以星期天为第一天,假如要以星期一为第一天就是
t(N^;zz8M+R 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[/size]