ISOWEEK的演算法

sdvingo發表於2007-04-24

算ISOWEEK的時候,通常是以(該日的所屬週數+1 )- (該年的1-4所屬週數),但也有特殊的情況,case1 :可能當年的一月1號到3號是屬於前年的,case2 : 可能前年12月29到31號是屬於下一年的.

SQL的演算法

CREATE FUNCTION ISOweek (@DATE datetime)
RETURNS int
AS
BEGIN
DECLARE @ISOweek int
SET @ISOweek= DATEPART(wk,@DATE)+1
-DATEPART(wk,CAST(DATEPART(yy,@DATE) as CHAR(4))+'0104')
--Special cases: Jan 1-3 may belong to the previous year
IF (@ISOweek=0)
SET @ISOweek=dbo.ISOweek(CAST(DATEPART(yy,@DATE)-1
AS CHAR(4))+'12'+ CAST(24+DATEPART(DAY,@DATE) AS CHAR(2)))+1
--Special case: Dec 29-31 may belong to the next year
IF ((DATEPART(mm,@DATE)=12) AND
((DATEPART(dd,@DATE)-DATEPART(dw,@DATE))>= 28))
SET @ISOweek=1
RETURN(@ISOweek)
END

VB的演算法

Public Function CaclISOWeek(ByVal dt As Date ) As Integer
Dim tmpdate As Date
Dim isowkid As Integer
isowkid = DatePart("ww",dt)+1-DatePart("ww",DateSerial(Year(dt),01,04))
If isowkid = 0 Then
tmpdate = DateSerial(Year(dt)-1,12,24+Day(dt))
isowkid = DatePart("ww",tmpdate)+1-DatePart("ww",DateSerial(Year(dt)-1,01,04))+1
End If
If ((DatePart("m",dt)=12) And ((DatePart("d",dt)- DatePart("w",dt))>= 28)) Then
isowkid = 1
End If
CaclISOWeek = isowkid
End Function

下面再講一下ISOWEEK的年開始日

ISOweek 一年的開始日的演算法應該是先確定當年的一月一號是否星期4或星期五,假如是星期4或星期5,那年的開始日應該是分別加4或加3,找到下個星期的星期一;假如是其他的星期天數,那就用[x-2](x為用weekday 函式算出的數字,假如星期天x為1,假如星期六為7)算出星期一的那天天數.

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/443058/viewspace-912196/,如需轉載,請註明出處,否則將追究法律責任。

相關文章