28.01.2010, 14:07 | #1 |
Участник
|
Добрый день!
Столкнулся с такой проблемой. В запросе SQL при выводе номера недели текущая неделя (28.01.2010) считается 4-ой. Но некоторые люди, смотря на календарь, считают эту неделю 5-ой. Проблема возникает из-за того, что текущий год начался с пятницы. А согласно ГОСТу ИСО 8601-2001: Неделя начинается с понедельника и идентифицируется своим порядковым номером в году. Первой календарной неделей года считают первую неделю, содержащую первый четверг текущего года. В григорианском календаре — это неделя, содержащая 4 января. И вроде все ясно и понятно. Только хочется найти решение, которое поможет SQLю изменить взгляд на мир и сказать что 28.01.2010 относится все-таки к пятой неделе. Нет ли у кого идей на этот счет? |
|
28.01.2010, 15:17 | #2 |
Участник
|
Сори - немного перепутал
SQL считает текущую неделю 5-ой. А надо чтобы она стала для него 4-ой. Наверное воспользуемся условием - для 2010 года будем у недели отнимать единицу. |
|
28.01.2010, 20:18 | #3 |
Участник
|
Если SQL 2008-ой, то используйте параметр 'isowk' функции DATEPART, если нет, то используйте вот эту функцию:
Код: CREATE FUNCTION dbo.udf_GetISOWeekNumberFromDate(@dtDate as DATETIME) RETURNS INT WITH RETURNS NULL ON NULL INPUT /* ** Return the ISO week of the year regardless of the DATEFIRST session setting. */ AS BEGIN DECLARE @intISOWeekdayNumber INT DECLARE @dtThisThursday DATETIME DECLARE @dtFirstOfThisThursdaysYear DATETIME DECLARE @intISOWeekdayNumberOfFirstOfThisThursdaysYear INT DECLARE @dtFirstThursdayOfYear DATETIME DECLARE @intISOWeekNumber INT -- Get the ISO week day number (Monday = 1) for our date. SET @intISOWeekdayNumber = (((DATEPART(dw, @dtDate) - 1) + (@@DATEFIRST - 1)) % 7) + 1 -- Get the date of the Thursday in this ISO week. SET @dtThisThursday = DATEADD(d,(4 - @intISOWeekdayNumber),@dtDate) -- Get the date of the 1st January for 'this Thursdays' year. SET @dtFirstOfThisThursdaysYear = CAST(CAST(YEAR(@dtThisThursday) AS CHAR(4)) + '-01-01' AS DATETIME) SET @intISOWeekdayNumberOfFirstOfThisThursdaysYear = (((DATEPART(dw, @dtFirstOfThisThursdaysYear) - 1) + (@@DATEFIRST - 1)) % 7) + 1 -- Get the date of the first Thursday in 'this Thursdays' year. -- The year of which the ISO week is a part is the year of this date. IF (@intISOWeekdayNumberOfFirstOfThisThursdaysYear in (1,2,3,4)) SET @dtFirstThursdayOfYear = DATEADD(d,(4 - @intISOWeekdayNumberOfFirstOfThisThursdaysYear),@dtFirstOfThisThursdaysYear) ELSE SET @dtFirstThursdayOfYear = DATEADD(d,(4 - @intISOWeekdayNumberOfFirstOfThisThursdaysYear + 7),@dtFirstOfThisThursdaysYear) -- Work out how many weeks from the first Thursday to this Thursday. SET @intISOWeekNumber = DATEDIFF(d,@dtFirstThursdayOfYear,@dtThisThursday)/7+1 RETURN @intISOWeekNumber END GO http://www.rmjcs.com...07/Default.aspx Также можете посмотреть первый пример (Example A) по теме "CREATE FUNCTION" в BOL. Там тоже в качестве примера рассматривается подобная функция: http://technet.microsoft.com/ru-ru/library/ms186755(SQL.90).aspx |
|
01.02.2010, 12:45 | #4 |
Участник
|
Большое спасибо!
Пока решили отнимать единицу для 2010 года. Дальше посмотрим. |
|