T-SQL计算列如何获得ISO周数

时间:2015-01-15 17:25:13

标签: sql sql-server tsql calculated-columns

我有这个Calendar表(下面的代码),基于Date,然后是Calculated列。问题是,由于逻辑52 * 7 = 364,它返回了我第53周,所以实际上我们每年总会得到一些“备用”天数,例如2014年的情况,例如:

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

1 个答案:

答案 0 :(得分:2)

在SQL Server 2008+中,您可以使用以下内容:

SELECT DATEPART(ISO_WEEK, <DATE>)

以下SO问题讨论了推导ISO周的其他方法:

Isoweek in SQL Server 2005