2015-01-15 55 views
3

我有此日曆表(代碼如下)基於日期然後計算列。問題是,由於邏輯52 * 7 = 364,它返回給我第53周,所以實際上我們總是每年獲得一些「備用」天數,例如2014年的這些天發生的情況:T-SQL計算列如何獲取ISO周編號

2014-12-28
2014年12月29日
情節中字
2014-12-31

在我公司工作,我們必須使用ISO日曆周。如何更改此表以獲取ISO日曆周而不是此日期?

我忘了提,我使用:SQL Server 2008 R2和2012年

CREATE TABLE [dbo].[TO_BDB_NOSSCE_CALENDAR](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [DATE] [date] NOT NULL, 
    [YEAR] AS (datepart(year,[DATE])) PERSISTED, 
    [SEMESTER] AS (case when datepart(month,[DATE])<(7) then '1' else '2' end) PERSISTED NOT NULL, 
    [TRIMESTER] AS (case when datepart(month,[DATE])<(4) then '1' else case when datepart(month,[DATE])<(7) then '2' else case when datepart(month,[DATE])<(10) then '3' else '4' end end end) PERSISTED NOT NULL, 
    [MONTH] AS (case when len(CONVERT([varchar](2),datepart(month,[DATE]),0))=(1) then '0'+CONVERT([varchar](2),datepart(month,[DATE]),0) else CONVERT([varchar](2),datepart(month,[DATE]),0) end) PERSISTED, 
    [WEEK] AS (case when len(CONVERT([varchar](2),datepart(week,[DATE]),0))=(1) then '0'+CONVERT([varchar](2),datepart(week,[DATE]),0) else CONVERT([varchar](2),datepart(week,[DATE]),0) end), 
    [DAY] AS (case when len(CONVERT([varchar](2),datepart(day,[DATE]),0))=(1) then '0'+CONVERT([varchar](2),datepart(day,[DATE]),0) else CONVERT([varchar](2),datepart(day,[DATE]),0) end) PERSISTED, 
    [WEEKNUMBER] AS (datepart(week,[DATE])), 
PRIMARY KEY CLUSTERED 
(
    [ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

SET ANSI_PADDING OFF 
GO 
+2

請記住,除了週數之外,您可能還需要週年(不一定等於日期年)。 2010年1月1日是2009年最後一個ISO周的一部分。你真的不想把這個作爲「2010年第53周」來表達,那完全是錯誤的。另外請記住,如該具體示例所示,ISO週數可能*仍然會高達53. – hvd 2015-01-15 17:34:43

回答

2

在SQL Server 2008+,你可以使用以下命令:

SELECT DATEPART(ISO_WEEK, <DATE>) 

所以下面問題討論導出ISO周的其他方法:

Isoweek in SQL Server 2005

+1

完美,謝謝!我忘了在原帖中提到我有版本2008 R2和2012 ...所以總是有一個更簡單的方法! – KathyBlue 2015-01-16 08:51:04

+2

請注意,除了週數外,包含ISO周**年**非常重要,因爲它可能與正常日期年份不同。它可以這樣計算:'YEAR(DATEADD(wk,DATEDIFF(d,0,@ dt)/ 7,3))' – 2016-04-20 10:16:02