Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Определить номер недели месяца  [new]
rushik
Member

Откуда:
Сообщений: 2
Здравствуйте!

Есть таблица с полем Date и заполнена значениями на 3 года начиная с 1 января 2012.
Нужно в соседний столбец записать номер недели месяца, при этом учесть, если на стыке месяцев среда-суббота относятся к предыдущему месяцу, то номер для всей недели будет номер последней недели предыдущего месяца. А если неделя начиная со среды уже в новом месяце, то номер недели будет 1 в том числе и у дней в предыдущем месяце.

К примеру:
День недели | Число | номер_недели
--------------------------------------------------------
Понедельник | 29 (30) | 5 (1)
Вторник | 30 (31) | 5 (1)
Среда | 31 (1) | 5 (1)
Четверг | 1 (2) | 5 (1)
Пятница | 2 (3) | 5 (1)
Суббота | 3 (4) | 5 (1)
Воскресенье | 4 (5) | 5 (1)

В () - второй вариант.
2 ноя 13, 23:44    [15070405]     Ответить | Цитировать Сообщить модератору
 Re: Определить номер недели месяца  [new]
aleks2
Guest
У вас проблемы с арифметикой и CASE?
Или первое число месяца не умеете определять?
3 ноя 13, 10:39    [15071127]     Ответить | Цитировать Сообщить модератору
 Re: Определить номер недели месяца  [new]
qwerty112
Guest
rushik
Нужно в соседний столбец записать номер недели месяца, при этом учесть, если на стыке месяцев среда-суббота относятся к предыдущему месяцу, то номер для всей недели будет номер последней недели предыдущего месяца. А если неделя начиная со среды уже в новом месяце, то номер недели будет 1 в том числе и у дней в предыдущем месяце.

т.е. первая неделя месяца - неделя, в которой среда принадлежит этому месяцу
как-то так, можно
+
declare @t table (dt datetime)

;with cte as (
select cast('20120101' as datetime) as dt
union all
select dateadd(day, 1, dt) from cte
where dt<'20141231')

insert into @t (dt)
select dt from cte
option(maxrecursion 0)

set datefirst 1

select datepart(weekday, t.dt) as weekday, t.dt, a.year, a.month, a.week_my
from @t t
left join
	(select 
		 dateadd(day, -2, dt) as dt_week_start 
		,dateadd(day, 4, dt) as dt_week_finish 
		,year(dt) as year
		,month(dt) as month
		,row_number()over(partition by year(dt), month(dt) order by dt) as week_my
	from @t 
	where datepart(weekday, dt)=3) a
on	t.dt between a.dt_week_start and a.dt_week_finish 

+
weekday     dt                      year        month       week_my
----------- ----------------------- ----------- ----------- --------------------
7           2012-01-01 00:00:00.000 NULL        NULL        NULL
1           2012-01-02 00:00:00.000 2012        1           1
2           2012-01-03 00:00:00.000 2012        1           1
3           2012-01-04 00:00:00.000 2012        1           1
4           2012-01-05 00:00:00.000 2012        1           1
5           2012-01-06 00:00:00.000 2012        1           1
6           2012-01-07 00:00:00.000 2012        1           1
7           2012-01-08 00:00:00.000 2012        1           1
1           2012-01-09 00:00:00.000 2012        1           2
2           2012-01-10 00:00:00.000 2012        1           2
3           2012-01-11 00:00:00.000 2012        1           2
4           2012-01-12 00:00:00.000 2012        1           2
5           2012-01-13 00:00:00.000 2012        1           2
6           2012-01-14 00:00:00.000 2012        1           2
7           2012-01-15 00:00:00.000 2012        1           2
1           2012-01-16 00:00:00.000 2012        1           3
2           2012-01-17 00:00:00.000 2012        1           3
3           2012-01-18 00:00:00.000 2012        1           3
4           2012-01-19 00:00:00.000 2012        1           3
5           2012-01-20 00:00:00.000 2012        1           3
6           2012-01-21 00:00:00.000 2012        1           3
7           2012-01-22 00:00:00.000 2012        1           3
1           2012-01-23 00:00:00.000 2012        1           4
2           2012-01-24 00:00:00.000 2012        1           4
3           2012-01-25 00:00:00.000 2012        1           4
4           2012-01-26 00:00:00.000 2012        1           4
5           2012-01-27 00:00:00.000 2012        1           4
6           2012-01-28 00:00:00.000 2012        1           4
7           2012-01-29 00:00:00.000 2012        1           4
1           2012-01-30 00:00:00.000 2012        2           1
2           2012-01-31 00:00:00.000 2012        2           1
3           2012-02-01 00:00:00.000 2012        2           1
4           2012-02-02 00:00:00.000 2012        2           1
5           2012-02-03 00:00:00.000 2012        2           1
6           2012-02-04 00:00:00.000 2012        2           1
7           2012-02-05 00:00:00.000 2012        2           1

только не совсем понятно, как нужно обрабатывать "начало времён" (20120101), если оно пришлось на день - больший среды ?
это - первая неделя января, или последняя неделя декабря, который не попал в календарь ?
если 1-ое, то так можно "дообработать" такое
select datepart(weekday, t.dt) as weekday, t.dt, a.year, a.month, isnull(a.week_my,0)
+ case when datepart(weekday, '20120101')>3 and isnull(a.year,2012)=2012 and isnull(a.month,1)=1 then 1 else 0 end as week_my
3 ноя 13, 11:09    [15071160]     Ответить | Цитировать Сообщить модератору
 Re: Определить номер недели месяца  [new]
rushik
Member

Откуда:
Сообщений: 2
qwerty112,

Большое спасибо за помощь!
А "дообработка", это должна быть последняя неделя декабря, не вошедшего в "календарь" :) Ещё раз спасибо!
3 ноя 13, 15:12    [15071757]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить