Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Узнать начало недели по её номеру  [new]
Слонъ
Guest
Уважаемые, я немного запутался... Понимаю, как получить номер недели, но как получить по номеру недели дату начала недели - никак не могу понять.
Например, номер недели в этом году: 33, начало недели должно быть 2014-08-11.
Подскажите, будьте добры, как выразить это одним select-ом?
17 ноя 14, 17:39    [16860848]     Ответить | Цитировать Сообщить модератору
 Re: Узнать начало недели по её номеру  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Слонъ,

select DATEADD(week, 32, '20140101') - 2
17 ноя 14, 17:41    [16860875]     Ответить | Цитировать Сообщить модератору
 Re: Узнать начало недели по её номеру  [new]
Слонъ
Guest
WarAnt, ну а как быть в следующем году? А через год? Каждый раз скрипт править?..
17 ноя 14, 17:46    [16860911]     Ответить | Цитировать Сообщить модератору
 Re: Узнать начало недели по её номеру  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Слонъ
WarAnt, ну а как быть в следующем году? А через год? Каждый раз скрипт править?..
\

Вот вы ленивые пошли все:)

select DATEADD(week, 32, '2014') - (datepart(dw, DATEADD(week, 32, '2014')) - 1)


Год надеюсь сможете сами 2015 поставить;)
17 ноя 14, 17:52    [16860948]     Ответить | Цитировать Сообщить модератору
 Re: Узнать начало недели по её номеру  [new]
Слонъ
Guest
С константами не пройдёт. Требуется чтобы результат не зависел от года, указанного в запросе и брался всегда текущий год.
Попробовал год заменить на DATEPART(year, GETDATE()) - вообще не так работает, как если бы год в кавычках указать. Видимо, оно считает значение как int, а не как date
17 ноя 14, 18:09    [16861110]     Ответить | Цитировать Сообщить модератору
 Re: Узнать начало недели по её номеру  [new]
Shakill
Member

Откуда: мск
Сообщений: 1882
Слонъ
С константами не пройдёт. Требуется чтобы результат не зависел от года, указанного в запросе и брался всегда текущий год.
Попробовал год заменить на DATEPART(year, GETDATE()) - вообще не так работает, как если бы год в кавычках указать. Видимо, оно считает значение как int, а не как date

а что вам мешает сделать еще одно действие и получить из целого значения номера года дату начала года?
17 ноя 14, 18:13    [16861141]     Ответить | Цитировать Сообщить модератору
 Re: Узнать начало недели по её номеру  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Shakill
Слонъ
С константами не пройдёт. Требуется чтобы результат не зависел от года, указанного в запросе и брался всегда текущий год.
Попробовал год заменить на DATEPART(year, GETDATE()) - вообще не так работает, как если бы год в кавычках указать. Видимо, оно считает значение как int, а не как date

а что вам мешает сделать еще одно действие и получить из целого значения номера года дату начала года?


Я уже выше написал что мешает:)

автор
С константами не пройдёт. Требуется чтобы результат не зависел от года, указанного в запросе и брался всегда текущий год.
Попробовал год заменить на DATEPART(year, GETDATE()) - вообще не так работает, как если бы год в кавычках указать. Видимо, оно считает значение как int, а не как date


эх
select DATEADD(week, 32, convert(varchar(4), datepart(year, getdate()))) - (datepart(dw, DATEADD(week, 32, convert(varchar(4), datepart(year, getdate())))) - 1)
17 ноя 14, 18:23    [16861208]     Ответить | Цитировать Сообщить модератору
 Re: Узнать начало недели по её номеру  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Слонъ
С константами не пройдёт. Требуется чтобы результат не зависел от года, указанного в запросе и брался всегда текущий год.
Попробовал год заменить на DATEPART(year, GETDATE()) - вообще не так работает, как если бы год в кавычках указать. Видимо, оно считает значение как int, а не как date


Ну и так для общего развития, дата это и есть int, а точнее число дней от даты в зависимости от того какой из типов datetime вы используете. Поэтому если вы преобразовываете int в дату то и получаете 2014`й день от ...
17 ноя 14, 18:27    [16861226]     Ответить | Цитировать Сообщить модератору
 Re: Узнать начало недели по её номеру  [new]
Слонъ
Guest
Да, в общем-то сделал похожим образом, спасибо за помощь! У меня получилось так:
select DATEADD(week, 1, cast(DATEPART(year, GETDATE()) as varchar)) - (datepart(dw, DATEADD(week, 1, cast (DATEPART(year, GETDATE()) as varchar))) - 2)
17 ноя 14, 18:32    [16861255]     Ответить | Цитировать Сообщить модератору
 Re: Узнать начало недели по её номеру  [new]
o-o
Guest
кто в лес, кто по дрова
но главное, что все довольны
declare @w int = 33; 

set language russian;

select DATEADD(week, @w, convert(varchar(4), datepart(year, getdate()))) - 
      (datepart(dw, DATEADD(week, @w, convert(varchar(4), datepart(year, getdate())))) - 1) as [WarAnt's 1st date RUS],
       datename(dw, DATEADD(week, @w, convert(varchar(4), datepart(year, getdate()))) - 
      (datepart(dw, DATEADD(week, @w, convert(varchar(4), datepart(year, getdate())))) - 1)) as [WarAnt's 1st day of week RUS],
       
       DATEADD(week, @w, cast(DATEPART(year, GETDATE()) as varchar)) - 
      (datepart(dw, DATEADD(week, @w, cast (DATEPART(year, GETDATE()) as varchar))) - 2) as [Слонъ's 1st date RUS],  
       datename(dw, DATEADD(week, @w, cast(DATEPART(year, GETDATE()) as varchar)) - 
      (datepart(dw, DATEADD(week, @w, cast (DATEPART(year, GETDATE()) as varchar))) - 2))as [Слонъ's 1st day of week RUS]
      
set language us_english;

select DATEADD(week, @w, convert(varchar(4), datepart(year, getdate()))) - 
      (datepart(dw, DATEADD(week, @w, convert(varchar(4), datepart(year, getdate())))) - 1) as [WarAnt's 1st date ENG],
       datename(dw, DATEADD(week, @w, convert(varchar(4), datepart(year, getdate()))) - 
      (datepart(dw, DATEADD(week, @w, convert(varchar(4), datepart(year, getdate())))) - 1)) as [WarAnt's 1st day of week ENG],
       
       DATEADD(week, @w, cast(DATEPART(year, GETDATE()) as varchar)) - 
      (datepart(dw, DATEADD(week, @w, cast (DATEPART(year, GETDATE()) as varchar))) - 2) as [WarAnt's 1st date ENG],  
       datename(dw, DATEADD(week, @w, cast(DATEPART(year, GETDATE()) as varchar)) - 
      (datepart(dw, DATEADD(week, @w, cast (DATEPART(year, GETDATE()) as varchar))) - 2))as [Слонъ's 1st day of week ENG]

WarAnt's 1st date RUS WarAnt's 1st day of week RUS Слонъ's 1st date RUS Слонъ's 1st day of week RUS
2014-08-18 00:00:00.000 понедельник 2014-08-19 00:00:00.000 вторник

WarAnt's 1st date ENG WarAnt's 1st day of week ENG WarAnt's 1st date ENG Слонъ's 1st day of week ENG
2014-08-17 00:00:00.000 Sunday 2014-08-18 00:00:00.000 Monday
17 ноя 14, 18:53    [16861376]     Ответить | Цитировать Сообщить модератору
 Re: Узнать начало недели по её номеру  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Возможно я не в тему, но есть же в FAQ отличные вычисления от iap: Некоторые вычисления с датой
Оттуда и плясать.
Отличный гайд, столько наглядных примеров, что даже стыдно спрашивать что-то про дату, т.к.: "Все уже украдено до нас".
Нужно только немного усилий мозга, чтобы адаптировать это к своей ситуации.
ИМХО.
17 ноя 14, 19:08    [16861457]     Ответить | Цитировать Сообщить модератору
 Re: Узнать начало недели по её номеру  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4822
Закешируйте её в таблицу с правильными индексами и развлекайтесь.
https://www.sql.ru/forum/1097504/vuha-dlya-kalendarya?hl=????? ??? ?????????
17 ноя 14, 19:15    [16861494]     Ответить | Цитировать Сообщить модератору
 Re: Узнать начало недели по её номеру  [new]
o-o
Guest
господи.
теперь ему таблицы понравились. с индексами.
нет, ну вперед конечно, хоть не рекурсивное cte.

declare @w int = 33;       
select dateadd(ww, datediff(ww, '20010101', getdate()) - (datepart(ww, getdate()) - @w), '20010101')
---
2014-08-11 00:00:00.000
17 ноя 14, 22:43    [16862205]     Ответить | Цитировать Сообщить модератору
 Re: Узнать начало недели по её номеру  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
o-o
кто в лес, кто по дрова
но главное, что все довольны
declare @w int = 33; 

set language russian;

select DATEADD(week, @w, convert(varchar(4), datepart(year, getdate()))) - 
      (datepart(dw, DATEADD(week, @w, convert(varchar(4), datepart(year, getdate())))) - 1) as [WarAnt's 1st date RUS],
       datename(dw, DATEADD(week, @w, convert(varchar(4), datepart(year, getdate()))) - 
      (datepart(dw, DATEADD(week, @w, convert(varchar(4), datepart(year, getdate())))) - 1)) as [WarAnt's 1st day of week RUS],
       
       DATEADD(week, @w, cast(DATEPART(year, GETDATE()) as varchar)) - 
      (datepart(dw, DATEADD(week, @w, cast (DATEPART(year, GETDATE()) as varchar))) - 2) as [Слонъ's 1st date RUS],  
       datename(dw, DATEADD(week, @w, cast(DATEPART(year, GETDATE()) as varchar)) - 
      (datepart(dw, DATEADD(week, @w, cast (DATEPART(year, GETDATE()) as varchar))) - 2))as [Слонъ's 1st day of week RUS]
      
set language us_english;

select DATEADD(week, @w, convert(varchar(4), datepart(year, getdate()))) - 
      (datepart(dw, DATEADD(week, @w, convert(varchar(4), datepart(year, getdate())))) - 1) as [WarAnt's 1st date ENG],
       datename(dw, DATEADD(week, @w, convert(varchar(4), datepart(year, getdate()))) - 
      (datepart(dw, DATEADD(week, @w, convert(varchar(4), datepart(year, getdate())))) - 1)) as [WarAnt's 1st day of week ENG],
       
       DATEADD(week, @w, cast(DATEPART(year, GETDATE()) as varchar)) - 
      (datepart(dw, DATEADD(week, @w, cast (DATEPART(year, GETDATE()) as varchar))) - 2) as [WarAnt's 1st date ENG],  
       datename(dw, DATEADD(week, @w, cast(DATEPART(year, GETDATE()) as varchar)) - 
      (datepart(dw, DATEADD(week, @w, cast (DATEPART(year, GETDATE()) as varchar))) - 2))as [Слонъ's 1st day of week ENG]

WarAnt's 1st date RUS WarAnt's 1st day of week RUS Слонъ's 1st date RUS Слонъ's 1st day of week RUS
2014-08-18 00:00:00.000 понедельник 2014-08-19 00:00:00.000 вторник

WarAnt's 1st date ENG WarAnt's 1st day of week ENG WarAnt's 1st date ENG Слонъ's 1st day of week ENG
2014-08-17 00:00:00.000 Sunday 2014-08-18 00:00:00.000 Monday


Про америкосов вопрос не поступал, понятно что у них все через ... и это нужно учитывать.
18 ноя 14, 11:24    [16863933]     Ответить | Цитировать Сообщить модератору
 Re: Узнать начало недели по её номеру  [new]
o-o
Guest
WarAnt,

во блин, у него ответ подписан для 33-ей недели, это дата 2014-08-11.
Слонъ
номер недели в этом году: 33, начало недели должно быть 2014-08-11.

у вас ни в каком языке эта дата не получается,
я показываю, что у вас хоть какое-то подобие первого дня недели,
а у "взявшего вашу идею" ТС вообще неделя начинается не с того дня при любом раскладе
18 ноя 14, 11:37    [16864063]     Ответить | Цитировать Сообщить модератору
 Re: Узнать начало недели по её номеру  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
o-o
WarAnt,

во блин, у него ответ подписан для 33-ей недели, это дата 2014-08-11.
Слонъ
номер недели в этом году: 33, начало недели должно быть 2014-08-11.

у вас ни в каком языке эта дата не получается,
я показываю, что у вас хоть какое-то подобие первого дня недели,
а у "взявшего вашу идею" ТС вообще неделя начинается не с того дня при любом раскладе


чего вдруг не получается то, просто нужно из взятого номера недели вычесть единицу при запросе
declare @week int = 33
select DATEADD(week, @week - 1, convert(varchar(4), datepart(year, getdate()))) - (datepart(dw, DATEADD(week,  @week - 1, convert(varchar(4), datepart(year, getdate())))) - 1)


2014-08-11 00:00:00.000


о-о вы меня удивили чес слово. И да это канает только для русского языка.
18 ноя 14, 11:48    [16864177]     Ответить | Цитировать Сообщить модератору
 Re: Узнать начало недели по её номеру  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Что уже закрыть топик:)

вот вариант для обоих языков

select @@DATEFIRST,DATEADD(week, @week - 1, 
convert(varchar(4), datepart(year, getdate()))) - 
(datepart(dw, DATEADD(week,  @week - 1, convert(varchar(4), datepart(year, getdate())))) - (2 - @@DATEFIRST % 7))
18 ноя 14, 11:59    [16864269]     Ответить | Цитировать Сообщить модератору
 Re: Узнать начало недели по её номеру  [new]
o-o
Guest
WarAnt,

слушайте, вчера было уже время отваливания с работы,
я, не вдаваясь в подробности, беру ваш код, код ТС,
подставляю 33, удивляюсь
да, у меня логин "америкосный", т.е. ответ мне выпал воскресный.
я тогда собираю вместе ваш и его код и просто привожу результат,
даже ответ не пишу, всего-то показываю, к чему пришли.
никаких наездов :)
18 ноя 14, 12:01    [16864289]     Ответить | Цитировать Сообщить модератору
 Re: Узнать начало недели по её номеру  [new]
o-o
Guest
WarAnt
Что уже закрыть топик:)

вот вариант для обоих языков

select @@DATEFIRST,DATEADD(week, @week - 1, 
convert(varchar(4), datepart(year, getdate()))) - 
(datepart(dw, DATEADD(week,  @week - 1, convert(varchar(4), datepart(year, getdate())))) - (2 - @@DATEFIRST % 7))


так у меня для всех языков что-ли? 16862205
зачем вообще анализировать @@DATEFIRST,
достаточно базовую дату выбрать так, чтобы это был и понедельник, и начало первой недели.
т.е. 20010101 сгодился.

хотя я что, я за разнообразие :)
18 ноя 14, 12:06    [16864334]     Ответить | Цитировать Сообщить модератору
 Re: Узнать начало недели по её номеру  [new]
iap
Member

Откуда: Москва
Сообщений: 47063
o-o
достаточно базовую дату выбрать так, чтобы это был и понедельник, и начало первой недели.
т.е. 20010101 сгодился.
'19000101' - понедельник!
И преобразуется в целый 0
18 ноя 14, 12:57    [16864779]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить