Как рассчитать последнюю неделю месяца по WeekNO и году в SQL - PullRequest
2 голосов
/ 18 марта 2011

Я хочу вычислить номер последней недели месяца в SQL.У меня есть номер недели и год.

Например.Если я передам WeekNo = 51, Year = 2008, то функция должна вернуть LastWeekofMonth = 52.

Я хочу рассчитать номер недели, используя следующие стандарты.

Согласно используемому ISO 8601: 1988в Швеции первая неделя года - это первая неделя, на которую в течение нового года приходится как минимум четыре дня.

Так что, если ваша неделя начинается в понедельник, первый четверг любого года находится в пределах первой недели.Вы можете DateAdd или DateDiff из этого.

Пожалуйста, помогите мне ..........

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 18 марта 2011
SELECT WEEK(LAST_DAY(STR_TO_DATE('2008-51-Mon', '%x-%v-%a')));

Следует выполнить трюк для получения номера недели за последнюю неделю с MySQL:

Сначала я конвертирую в дату, затем получаю последний день месяца (здесь: 2008-12-31), затем я вычисляю неделю последнего дня месяца (52).

Должно быть легко превратить его в функцию.

Надеюсь, это поможет.

1 голос
/ 18 марта 2011

Это довольно просто, если вы используете таблицу календаря. Месяц, который вам нужен, указан в этом запросе.

select iso_year, month_of_year
from calendar c
where iso_year = 2008 and iso_week = 51
group by iso_year, month_of_year
--
iso_year  month_of_year
2008      12

Таким образом, вы можете использовать этот результат в соединении в таблице календаря, как это.

select max(c.iso_week) as last_week_of_month
    from calendar c
    inner join 
        (select iso_year, month_of_year
         from calendar c
         where iso_year = 2008 and iso_week = 51
         group by iso_year, month_of_year) m
    on m.iso_year = c.iso_year and m.month_of_year = c.month_of_year;
--
last_week_of_month
52

Вот один пример календарной таблицы , но он довольно слаб по ограничениям CHECK.

0 голосов
/ 18 марта 2011

Если вы используете SQL Server , вы можете выполнить расчет, используя основную таблицу, не создавая таблицу календаря. Этот парень дает вам очень хорошее объяснение, которое я рекомендую вам прочитать. Его SQL для расчета первого и последнего воскресений каждого месяца может быть адаптирован для вашего использования:

declare @year int
set @year =2011 

select min(dates) as first_sunday,max(dates) as last_sunday from
(
select dateadd(day,number-1,DATEADD(year,@year-1900,0))
as dates from master..spt_values
where type='p' and number between 1 and
DATEDIFF(day,DATEADD(year,@year-1900,0),DATEADD(year,@year-1900+1,0))
) as t
where DATENAME(weekday,dates)='sunday'
group by DATEADD(month,datediff(month,0,dates),0)

Редактировать: Если у вас есть дата четверга, вы можете получить номер недели с этой даты, например:

DECLARE @Dt datetime

SELECT @Dt='02-21-2008'

SELECT DATEPART( wk, @Dt)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...