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

Откуда:
Сообщений: 57
Дано: Номер недели, год.
Найти: Дату первого дня этой недели.

set nocount on

declare @wk int, @yy int
select @wk=4, @yy=2004

declare @d1 datetime, @d2 datetime, @d3 datetime


select @d1=dateadd(yy,@yy-datepart(yy,getdate()),getdate())/*Переходим на нужный год*/
select @d1

select @d2=dateadd(dw,-datepart(dw,@d1)+1,@d1)/*Переходим на первый день недели*/
select @d2


select @d3=dateadd(wk,-datepart(wk,@d2)+1,@d2)/*Переходим на первую неделю года*/
select @d3

select dateadd(wk,@wk,@d3)

set nocount off

--------------------------- 
2004-11-24 10:29:18.547

                            
--------------------------- 
2004-11-21 10:29:18.547

                            
--------------------------- 
2003-12-28 10:29:18.547

                            
--------------------------- 
2004-01-25 10:29:18.547


Может быть, можно проще?
Подскажите.

PS. Специально было разбито на этапы, а не одним запросом, для наглядности
24 ноя 05, 10:44    [2102473]     Ответить | Цитировать Сообщить модератору
 Re: Определить первый день недели по номеру недели в году  [new]
ЭтоЯ
Guest
Ну, на вскидку, - один шаг явно лишний

set nocount on

declare @wk int, @yy int
select @wk=4, @yy=2004

declare @d1 datetime, @d2 datetime, @d3 datetime

select @d1=CONVERT(datetime,'01.01.'+CONVERT(varchar,@yy))/*Переходим на нужный год*/
select @d1

SELECT @d2=DateAdd(wk,@wk,@d1) /*Переходим на нужную неделю года*/
select @d2

select @d3=dateadd(dw,-datepart(dw,@d2)+1,@d2)/*Переходим на первый день недели*/
select @d3

set nocount off
Заодно здесь обрезается и никому не нужное текущее время.
А так, чтобы принципиально по другому надо подумать :)
24 ноя 05, 11:07    [2102671]     Ответить | Цитировать Сообщить модератору
 Re: Определить первый день недели по номеру недели в году  [new]
aleks2
Guest
declare @y int, @w int, @d datetime
set @y=3111
set @w=13
set @d=dateadd(week, @w-1, dateadd(year, @y-datepart(year, 0), 0))
set @d=dateadd(weekday, 1-datepart(weekday, @d), @d)
select @d, datepart(week, @d) week, datepart(weekday, @d) weekday
24 ноя 05, 11:14    [2102733]     Ответить | Цитировать Сообщить модератору
 Re: Определить первый день недели по номеру недели в году  [new]
ЭтоЯ
Guest
В догонку ...
Все зависит от того - для чего это предполагается использовать.
Если в достаточно объемных выборках, то возможно выгоднее создать служебную таблицу, которая будет содержать дату и дату первого дня недели, соответствующего этой дате.
24 ноя 05, 11:19    [2102775]     Ответить | Цитировать Сообщить модератору
 Re: Определить первый день недели по номеру недели в году  [new]
Брюлик
Member

Откуда:
Сообщений: 690
create function dbo.NthWeekDay(
@first datetime, ---'20030801
@nth tinyint, -- Which of them - 1st, 2nd, etc.
@dow tinyint -- Day of week we want
) returns datetime as begin
-- Note: Returns a date in a later month if @nth is too large

declare @result datetime
set @result = @first + 7*(@nth-1)
return @result + (7 + @dow - datepart(weekday,@result))%7
end



SELECT dbo.NthWeekDay ('20040101',4,1)
24 ноя 05, 11:23    [2102807]     Ответить | Цитировать Сообщить модератору
 Re: Определить первый день недели по номеру недели в году  [new]
vooo
Member

Откуда:
Сообщений: 1316
как вариант
declare @wk int, @yy int,@d datetime
select @wk=4, @yy=2004
set dateformat dmy
---понедельник
SET DATEFIRST 1
---переходим на год
select @d='01.01.'+convert(varchar(4),@yy)
---прибавляем кол-во недель и переходим на понед
select @d=dateadd(dd,7*@wk-DATEPART (dw ,@d),@d)
select @d
24 ноя 05, 11:27    [2102843]     Ответить | Цитировать Сообщить модератору
 Re: Определить первый день недели по номеру недели в году  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 34014
Блог
Может я чего-то не понял, но в 2004 году 4 неделя начинается с 19 или 26 января - понедельники (смотря как относится к куску недели с прошлого года). Если вам надо это, то можно так попробывать
declare @wk int, @yy int
select @wk=4, @yy=2004

-- С учетом куска недели прошлого года
select dateadd(week,@wk-1,dateadd(Year,@yy-1900,'19000101'))-datepart(weekday,dateadd(Year,@yy-1900,'19000101'))+1

-- Без учета куска недели прошлого года
select dateadd(week,@wk,dateadd(Year,@yy-1900,'19000101'))-datepart(weekday,dateadd(Year,@yy-1900,'19000101'))+1
24 ноя 05, 11:42    [2103014]     Ответить | Цитировать Сообщить модератору
 Re: Определить первый день недели по номеру недели в году  [new]
Ефим
Member

Откуда:
Сообщений: 57
Всем спасибо.
Не подумал про convert().
А с этим
Брюлик
create function dbo.NthWeekDay(
@first datetime, ---'20030801
@nth tinyint, -- Which of them - 1st, 2nd, etc.
@dow tinyint -- Day of week we want
) returns datetime as begin
-- Note: Returns a date in a later month if @nth is too large

declare @result datetime
set @result = @first + 7*(@nth-1)
return @result + (7 + @dow - datepart(weekday,@result))%7
end



SELECT dbo.NthWeekDay ('20040101',4,1)

не совсем понятно, буду разбираться.
24 ноя 05, 11:47    [2103062]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Определить первый день недели по номеру недели в году  [new]
кириллk
Member

Откуда:
Сообщений: 1057
а так можно?

select datepart(dw, getdate()) , first=
case
when datepart(dw, getdate())=2 then DATEADD(day, 1, getdate()-1)
when datepart(dw, getdate())=3 then DATEADD(day, 1, getdate()-2)
when datepart(dw, getdate())=4 then DATEADD(day, 1, getdate()-3)
when datepart(dw, getdate())=5 then DATEADD(day, 1, getdate()-4)
when datepart(dw, getdate())=6 then DATEADD(day, 1, getdate()-5)
when datepart(dw, getdate())=7 then DATEADD(day, 1, getdate()-6)
else getdate() end;
18 фев 16, 17:16    [18836940]     Ответить | Цитировать Сообщить модератору
 Re: Определить первый день недели по номеру недели в году  [new]
кириллk
Member

Откуда:
Сообщений: 1057
[quot кириллk]а так можно?
SET DATEFIRST 1
declare @d datetime = '2016-02-22'

select datepart(dw, @d) , first=
case
when datepart(dw, @d)=2 then DATEADD(day, 0, @d-1)
when datepart(dw, @d)=3 then DATEADD(day, 0, @d-2)
when datepart(dw, @d)=4 then DATEADD(day, 0, @d-3)
when datepart(dw, @d)=5 then DATEADD(day, 0, @d-4)
when datepart(dw, @d)=6 then DATEADD(day, 0, @d-5)
when datepart(dw, @d)=7 then DATEADD(day, 0, @d-6)
else @d end;
18 фев 16, 17:26    [18837028]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить