Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Слонъ
Guest |
Уважаемые, я немного запутался... Понимаю, как получить номер недели, но как получить по номеру недели дату начала недели - никак не могу понять. Например, номер недели в этом году: 33, начало недели должно быть 2014-08-11. Подскажите, будьте добры, как выразить это одним select-ом? |
17 ноя 14, 17:39 [16860848] Ответить | Цитировать Сообщить модератору |
WarAnt Member Откуда: Питер Сообщений: 2423 |
Слонъ,select DATEADD(week, 32, '20140101') - 2 |
17 ноя 14, 17:41 [16860875] Ответить | Цитировать Сообщить модератору |
Слонъ
Guest |
WarAnt, ну а как быть в следующем году? А через год? Каждый раз скрипт править?.. |
17 ноя 14, 17:46 [16860911] Ответить | Цитировать Сообщить модератору |
WarAnt Member Откуда: Питер Сообщений: 2423 |
Вот вы ленивые пошли все:) select DATEADD(week, 32, '2014') - (datepart(dw, DATEADD(week, 32, '2014')) - 1) Год надеюсь сможете сами 2015 поставить;) |
||
17 ноя 14, 17:52 [16860948] Ответить | Цитировать Сообщить модератору |
Слонъ
Guest |
С константами не пройдёт. Требуется чтобы результат не зависел от года, указанного в запросе и брался всегда текущий год. Попробовал год заменить на DATEPART(year, GETDATE()) - вообще не так работает, как если бы год в кавычках указать. Видимо, оно считает значение как int, а не как date |
17 ноя 14, 18:09 [16861110] Ответить | Цитировать Сообщить модератору |
Shakill Member Откуда: мск Сообщений: 1882 |
а что вам мешает сделать еще одно действие и получить из целого значения номера года дату начала года? |
||
17 ноя 14, 18:13 [16861141] Ответить | Цитировать Сообщить модератору |
WarAnt Member Откуда: Питер Сообщений: 2423 |
Я уже выше написал что мешает:)
эх 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] Ответить | Цитировать Сообщить модератору |
WarAnt Member Откуда: Питер Сообщений: 2423 |
Ну и так для общего развития, дата это и есть int, а точнее число дней от даты в зависимости от того какой из типов datetime вы используете. Поэтому если вы преобразовываете int в дату то и получаете 2014`й день от ... |
||
17 ноя 14, 18:27 [16861226] Ответить | Цитировать Сообщить модератору |
Слонъ
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] Ответить | Цитировать Сообщить модератору |
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]
|
||||||||||||||||||
17 ноя 14, 18:53 [16861376] Ответить | Цитировать Сообщить модератору |
SomewhereSomehow Member Откуда: Moscow Сообщений: 2480 Блог |
Возможно я не в тему, но есть же в FAQ отличные вычисления от iap: Некоторые вычисления с датой Оттуда и плясать. Отличный гайд, столько наглядных примеров, что даже стыдно спрашивать что-то про дату, т.к.: "Все уже украдено до нас". Нужно только немного усилий мозга, чтобы адаптировать это к своей ситуации. ИМХО. |
17 ноя 14, 19:08 [16861457] Ответить | Цитировать Сообщить модератору |
a_voronin Member Откуда: Москва Сообщений: 4822 |
Закешируйте её в таблицу с правильными индексами и развлекайтесь. https://www.sql.ru/forum/1097504/vuha-dlya-kalendarya?hl=????? ??? ????????? |
17 ноя 14, 19:15 [16861494] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
WarAnt Member Откуда: Питер Сообщений: 2423 |
Про америкосов вопрос не поступал, понятно что у них все через ... и это нужно учитывать. |
||||||||||||||||||||
18 ноя 14, 11:24 [16863933] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
WarAnt, во блин, у него ответ подписан для 33-ей недели, это дата 2014-08-11.
у вас ни в каком языке эта дата не получается, я показываю, что у вас хоть какое-то подобие первого дня недели, а у "взявшего вашу идею" ТС вообще неделя начинается не с того дня при любом раскладе |
||
18 ноя 14, 11:37 [16864063] Ответить | Цитировать Сообщить модератору |
WarAnt Member Откуда: Питер Сообщений: 2423 |
чего вдруг не получается то, просто нужно из взятого номера недели вычесть единицу при запросе 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)
о-о вы меня удивили чес слово. И да это канает только для русского языка. |
||||||
18 ноя 14, 11:48 [16864177] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
WarAnt, слушайте, вчера было уже время отваливания с работы, я, не вдаваясь в подробности, беру ваш код, код ТС, подставляю 33, удивляюсь ![]() да, у меня логин "америкосный", т.е. ответ мне выпал воскресный. я тогда собираю вместе ваш и его код и просто привожу результат, даже ответ не пишу, всего-то показываю, к чему пришли. никаких наездов :) |
18 ноя 14, 12:01 [16864289] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
так у меня для всех языков что-ли? 16862205 зачем вообще анализировать @@DATEFIRST, достаточно базовую дату выбрать так, чтобы это был и понедельник, и начало первой недели. т.е. 20010101 сгодился. хотя я что, я за разнообразие :) |
||
18 ноя 14, 12:06 [16864334] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47063 |
![]() И преобразуется в целый 0 |
||
18 ноя 14, 12:57 [16864779] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |