AXForum  
Вернуться   AXForum > Microsoft Dynamics NAV > NAV: Функционал
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.01.2010, 14:07   #1  
Lates is offline
Lates
Участник
 
207 / 10 (1) +
Регистрация: 08.02.2007
Добрый день!

Столкнулся с такой проблемой. В запросе SQL при выводе номера недели текущая неделя (28.01.2010) считается 4-ой.
Но некоторые люди, смотря на календарь, считают эту неделю 5-ой.
Проблема возникает из-за того, что текущий год начался с пятницы. А согласно ГОСТу ИСО 8601-2001:

Неделя начинается с понедельника и идентифицируется своим порядковым номером в году. Первой календарной неделей года считают первую неделю, содержащую первый четверг текущего года. В григорианском календаре — это неделя, содержащая 4 января.

И вроде все ясно и понятно. Только хочется найти решение, которое поможет SQLю изменить взгляд на мир и сказать что 28.01.2010 относится все-таки к пятой неделе.

Нет ли у кого идей на этот счет?
Старый 28.01.2010, 15:17   #2  
Lates is offline
Lates
Участник
 
207 / 10 (1) +
Регистрация: 08.02.2007
Сори - немного перепутал
SQL считает текущую неделю 5-ой.
А надо чтобы она стала для него 4-ой.

Наверное воспользуемся условием - для 2010 года будем у недели отнимать единицу.
Старый 28.01.2010, 20:18   #3  
Alterant is offline
Alterant
Участник
 
378 / 10 (1) +
Регистрация: 31.03.2004
Если 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  
Lates is offline
Lates
Участник
 
207 / 10 (1) +
Регистрация: 08.02.2007
Большое спасибо!
Пока решили отнимать единицу для 2010 года.
Дальше посмотрим.
 


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 00:46.