2015-01-15 5 views
3

У меня есть эта таблица календаря (код ниже) на основе столбцов 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 
+2

Имейте в виду, что в дополнение к номеру недели вам, вероятно, также понадобится год недели (что не обязательно равно дате года). 1 января 2010 года был частью последней недели ISO 2009 года. Вы действительно не хотите представлять это как «неделя недели 53», это было бы совершенно неправильно. Также имейте в виду, что, как указано в этом конкретном примере, номера недель ИСО могут * доходить до 53. – hvd

ответ

2

В SQL Server 2008+, вы можете использовать следующее:

SELECT DATEPART(ISO_WEEK, <DATE>) 

Следующая SO вопрос обсуждает другие методы для получения ИСО-недели:

Isoweek in SQL Server 2005

+1

Отлично, спасибо! Я забыл упомянуть в оригинальном посте, что у меня есть версии 2008 R2 и 2012 ... Так что всегда есть более простой способ! – KathyBlue

+2

Обратите внимание, что наряду с номером недели важно включить ISO-курс ** год **, потому что он может отличаться от нормального года. Его можно рассчитать следующим образом: 'YEAR (DATEADD (wk, DATEDIFF (d, 0, @dt)/7, 3))' –