我有此日曆表(代碼如下)基於日期然後計算列。問題是,由於邏輯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
請記住,除了週數之外,您可能還需要週年(不一定等於日期年)。 2010年1月1日是2009年最後一個ISO周的一部分。你真的不想把這個作爲「2010年第53周」來表達,那完全是錯誤的。另外請記住,如該具體示例所示,ISO週數可能*仍然會高達53. – hvd 2015-01-15 17:34:43