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

Откуда:
Сообщений: 133
Доброго времени суток, есть небольшой вопрос, подскажите
вот так определяю год.неделю
select convert(varchar(50), year(DateTransfer))+'.'+right('0'+convert(varchar(10), datepart(week, DateTransfer+1)),2)
получаю результат 2015.36
а вот как определит первый и после день этой недели (36)
Заранее спасибо
17 сен 15, 08:03    [18158935]     Ответить | Цитировать Сообщить модератору
 Re: узнать первый и последний день недели  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 658
maxwait,

SELECT  DATEADD(DD, DATEDIFF(DD, 0, DateTransfer)/7*7, 0)      AS [первый день недели]
      , DATEADD(DD, DATEDIFF(DD, 0, DateTransfer)/7*7+6, 0)    AS [последний день недели]
17 сен 15, 08:18    [18158959]     Ответить | Цитировать Сообщить модератору
 Re: узнать первый и последний день недели  [new]
maxwait
Member

Откуда:
Сообщений: 133
Guf,спасибо, но немного не то что я хотел, м.б. не правильно выразил мысль,
мне необходимо сгуппировать записи по неделям
группирую так

select лист
from table
.......
cross apply(
select convert(varchar(50), year(Date))+'.'+convert(varchar(10), datepart(week, Date)) where @Group = 1
) qq
......
group by qq.gg

в результате получаю набор записей сгруппированных по (2015.36)
к примеру
123, 2015.36
234, 2015.36
345, 2015.37
456, 2015.37
так вот как определить менно (36 или 37) недели первый и последний день недели
17 сен 15, 08:39    [18159001]     Ответить | Цитировать Сообщить модератору
 Re: узнать первый и последний день недели  [new]
Jaffar
Member

Откуда:
Сообщений: 633
declare @YEAR int, @WEEK int, @DT datetime
------------------------------------------
set @YEAR = 2015
set @WEEK = 38
set @DT   = '2015-12-31'
------------------------------------------

select 
tp.Year_ 'Год',
tp.Week_ 'Неделя',
convert(varchar(10), tp.Dt_, 104)+' г.'   'Произвольная дата',
convert(varchar(10), tp.Dt_, 104)+' г. ==> неделя ['+convert(varchar(10), tp2.FirstDayOfWeek, 104)+' г. ... '+convert(varchar(10), tp2.LastDayOfWeek, 104)+' г.]' 'Неделя по произвольной дате',
'Год: '+cast(tp.Year_ as varchar(4))+', неделя: '+cast(tp.Week_ as varchar(3))+' ==> неделя ['+convert(varchar(10), tp5.FirstDayOfWeek, 104)+' г. ... '+convert(varchar(10), tp5.LastDayOfWeek, 104)+' г.]' 'Неделя по году и № недели'
from (select @YEAR Year_, @WEEK Week_, convert(datetime, convert(varchar(10), @DT, 127), 127) Dt_ /**/ ) tp
--- оперделим день недели "по Русски"
cross apply(select IsNULL(NullIf(datepart(weekday, tp.DT_)-1, 0), 7) Dt_wd) tp1
cross apply(select tp.Dt_ - (tp1.Dt_wd - 1) FirstDayOfWeek,
				   tp.Dt_ + (7 - tp1.Dt_wd)  LastDayOfWeek) tp2
--- исходя из года и недели определим какую-то дату в неделе
cross apply(select convert(datetime, cast(tp.Year_ as varchar(4))+'-01-01', 127) + (tp.Week_ - 1)*7 DateInWeek) tp3 
cross apply(select IsNULL(NullIf(datepart(weekday, tp3.DateInWeek)-1, 0), 7) Dt_wd) tp4
cross apply(select tp3.DateInWeek - (tp4.Dt_wd - 1) FirstDayOfWeek,
				   tp3.DateInWeek + (7 - tp4.Dt_wd)  LastDayOfWeek) tp5
17 сен 15, 09:21    [18159108]     Ответить | Цитировать Сообщить модератору
 Re: узнать первый и последний день недели  [new]
aleks2
Guest
Проще надо быть

declare @weeknum int, @year int, @yearstart datetime;

set @weeknum = 36;
set @year = 2015;
set @yearstart = cast(@year as nvarchar(16))+'0101';

select  datepart(dw, @yearstart) [День недели первого дня года]

      , dateadd(dw, 8-datepart(dw, @yearstart), @yearstart) [Начало второй недели года]

      , dateadd( week 
               , @weeknum - 2
               , dateadd(dw, 8-datepart(dw, @yearstart), @yearstart)
                ) [Начало @weeknum недели года]

      , datepart(week,
				  dateadd( week 
                         , @weeknum - 2
                         , dateadd(dw, 8-datepart(dw, @yearstart), @yearstart)
                         )
                 ) - @weeknum [Проверка]
17 сен 15, 09:24    [18159121]     Ответить | Цитировать Сообщить модератору
 Re: узнать первый и последний день недели  [new]
maxwait
Member

Откуда:
Сообщений: 133
спасибо всем откликнувшимся, но вроде нашел подходящий мне вариант
SELECT DATEADD(DAY,-(@@DATEFIRST-2+DATEPART(WEEKDAY,arm.DateTransfer))%7,arm.DateTransfer)[Понедельник],
DATEADD(DAY,6-(@@DATEFIRST-2+DATEPART(WEEKDAY,arm.DateTransfer))%7,arm.DateTransfer)[Воскресенье]
17 сен 15, 09:28    [18159127]     Ответить | Цитировать Сообщить модератору
 Re: узнать первый и последний день недели  [new]
Jaffar
Member

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

да куда уж проще?
17 сен 15, 09:45    [18159171]     Ответить | Цитировать Сообщить модератору
 Re: узнать первый и последний день недели  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 658
maxwait,
А ты читал, как работает datepart(week, Date) ?
https://msdn.microsoft.com/ru-ru/library/ms174420(v=sql.120).aspx
Аргументы функции datepart, содержащие информацию о номере недели и дня

Когда переменная datepart содержит значение week (wk, ww) или weekday (dw), то тип возвращаемого значения определяется установками функции SET DATEFIRST.

1 января любого года определяет начальное число для раздела даты week datepart, например: DATEPART (wk, 'Jan 1, xxxx') = 1, где xxxx — любой год.

В этом году 1 января - четверг, и согласно документации, это первая неделя. У меня @@DATEFIRST = 7, значит вторая неделя начинается 4 января (воскресенье). А у тебя?
Определись, что для тебя начало недели, что конец? К какой неделе относится 1 января текущего года, и где у этой недели начало и конец.
Потом выполни пункт 6, и тогда кто-нибудь обязательно тебе поможет
17 сен 15, 09:55    [18159203]     Ответить | Цитировать Сообщить модератору
 Re: узнать первый и последний день недели  [new]
maxwait
Member

Откуда:
Сообщений: 133
Guf, Извините, Вы совершенно правы, понял свою ошибку.
17 сен 15, 10:20    [18159301]     Ответить | Цитировать Сообщить модератору
 Re: узнать первый и последний день недели  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21055
Напрочь не понимаю, нахуа тебе надо спрашивать, как
maxwait
узнать первый и последний день недели

если на самом деле
maxwait
необходимо сгруппировать записи по неделям

?
Последнее организует тупое
GROUP BY DatePart('ww',DateTransfer) [, DatePart('yy',DateTransfer)]

при правильном, как уже сказано значении @@DATEFIRST.
17 сен 15, 10:26    [18159329]     Ответить | Цитировать Сообщить модератору
 Re: узнать первый и последний день недели  [new]
iap
Member

Откуда: Москва
Сообщений: 47066
Akina
Напрочь не понимаю, нахуа тебе надо спрашивать, как
maxwait
узнать первый и последний день недели

если на самом деле
maxwait
необходимо сгруппировать записи по неделям

?
Последнее организует тупое
GROUP BY DatePart('ww',DateTransfer) [, DatePart('yy',DateTransfer)]


при правильном, как уже сказано значении @@DATEFIRST.
Может, проще
GROUP BY DATEDIFF(DAY,0,DateTransfer)/7
?
Если понедельник - первый день недели, ибо '19000101' - понедельник.
Другие случаи легко получить, заменяя 0 на нужное число от 0 до 6
17 сен 15, 11:39    [18159781]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить