Mic*_*Sim 8 sql sql-server datetime sql-server-2000
我遇到了这个问题
select datepart(ww, '20100208')
Run Code Online (Sandbox Code Playgroud)
在第7周在SQL Server 2000中返回结果.但是根据ISO 8601规范,08.02.2010应该是第6周!这导致交货周计算出现问题.
我该怎么做才能获得符合ISO 8601的周数值?
Ada*_*Dev 12
您可以非常轻松地在SQL 2008中执行此操作,因为它现在支持isoww作为第一个datepart参数.但是,这不是在SQL 2000(或2005)中.有一个函数此文章将这样做对你的SQL 2000/2005.
如果博客离线,这是功能.转到帖子了解有关ISO和非ISO周的更多信息.
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
Run Code Online (Sandbox Code Playgroud)
一种简单的方法是使用isowk而不是wk如下所示:
select datepart(isowk, '2010-02-08');
Run Code Online (Sandbox Code Playgroud)
就像提到的@MicSim 和@AdaTheDev 一样,这仅适用于较新的版本(>=2008)。