У меня есть эта таблица календаря (код ниже) на основе столбцов Date, а затем Calculated. Проблема в том, что он возвращает мне 53 недели из-за логики 52 * 7 = 364, поэтому на самом деле мы всегда получаем «свободные» дни в году, как это происходит, например, в 2014 году в эти дни:Расчетная колонка T-SQL, как получить номер недели ISO
2014-12-28
2014-12-29
2014-12-30
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 января 2010 года был частью последней недели ISO 2009 года. Вы действительно не хотите представлять это как «неделя недели 53», это было бы совершенно неправильно. Также имейте в виду, что, как указано в этом конкретном примере, номера недель ИСО могут * доходить до 53. – hvd