SQL Server中使用DATEPART的周数错误

SQL Server中使用DATEPART的周数错误,sql,sql-server,datetime,sql-server-2000,Sql,Sql Server,Datetime,Sql Server 2000,我有个问题 select datepart(ww, '20100208') 在SQL Server 2000中作为第7周的结果返回。但是根据规范,2010年2月8日应该是第6周!这会导致交付周计算出现问题 根据ISO 8601,我应该如何获取周数值?您可以在SQL 2008中非常轻松地执行此操作,因为它现在支持作为第一个datepart参数。然而,这并不是在SQL2000(或2005)中。本文中有一个函数将在SQL2000/2005中为您实现这一点 如果博客离线,这里是函数。转到帖子了解更多关

我有个问题

select datepart(ww, '20100208')
在SQL Server 2000中作为第7周的结果返回。但是根据规范,2010年2月8日应该是第6周!这会导致交付周计算出现问题


根据ISO 8601,我应该如何获取周数值?

您可以在SQL 2008中非常轻松地执行此操作,因为它现在支持作为第一个datepart参数。然而,这并不是在SQL2000(或2005)中。本文中有一个函数将在SQL2000/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

一种简单的方法是使用
isowk
而不是
wk
,如下所示:

select datepart(isowk, '2010-02-08');

就像前面提到的@MicSim和@AdaTheDev一样,这只适用于较新版本(>=2008)

不错的博客帖子,的确如此。:-)因此,在SQL Server 2000中,除了使用UDF?@MicSim之外,没有其他方法可以获取ISO周数,不幸的是,没有。有一种说法是,不要在SQL Server中执行此操作,而是按原样返回数据,并让调用代码确定周数。但这实际上取决于具体的需求,因此可能值得考虑,也可能不值得考虑。虽然这对于当前的SQL Server版本是正确的,但最初的问题是关于SQL Server 2000的。您提到的参数仅适用于2008版以后的版本。看看AdaTheDev的答案,他已经提到了。@MicSim你说得对。我的错误。我匆忙回答,没有注意。抱歉。我正在datepart查找此类参数,谢谢