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

Откуда: Киев
Сообщений: 178
Может кто то сталкивался!
С даты нужно нужно узнать какой это номер недели, отсчет начиная с начала года:
тоесть 01,01,2007 это первая неделя (1); 15,01,2007 это третья(3) и т.д.
Подскажите пожалуйста!
21 фев 08, 16:18    [5323844]     Ответить | Цитировать Сообщить модератору
 Re: номер недели  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
BOL->DATEPART
21 фев 08, 16:19    [5323858]     Ответить | Цитировать Сообщить модератору
 Re: номер недели  [new]
ветерочек
Guest
Ziks
15,01,2007 это третья(3) и т.д.

именно так?
21 фев 08, 16:23    [5323893]     Ответить | Цитировать Сообщить модератору
 Re: номер недели  [new]
Ziks
Member

Откуда: Киев
Сообщений: 178
пасиб, не увидел что в DATEPART еще и ww есть)
21 фев 08, 16:23    [5323897]     Ответить | Цитировать Сообщить модератору
 Re: номер недели  [new]
ветерочек
Guest
только select datepart(ww,'20080113') тоже 3 вернет:)
21 фев 08, 16:39    [5324038]     Ответить | Цитировать Сообщить модератору
 Re: номер недели  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
ветерочек
только select datepart(ww,'20080113') тоже 3 вернет:)


SET datefirst 1

select datepart(ww,'20080113')

SET datefirst 7

select datepart(ww,'20080113')

----------- 
2

            
----------- 
3
21 фев 08, 16:43    [5324081]     Ответить | Цитировать Сообщить модератору
 Re: номер недели  [new]
ветерочек
Guest
pkarklin
ветерочек
только select datepart(ww,'20080113') тоже 3 вернет:)


SET datefirst 1

select datepart(ww,'20080113')

SET datefirst 7

select datepart(ww,'20080113')

----------- 
2

            
----------- 
3

это я к тому что datepart(ww,'20040105') - 2 неделя
21 фев 08, 17:01    [5324259]     Ответить | Цитировать Сообщить модератору
 Re: номер недели  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
ветерочек
это я к тому что datepart(ww,'20040105') - 2 неделя


Вторая. Что не так?
21 фев 08, 17:18    [5324388]     Ответить | Цитировать Сообщить модератору
 Re: номер недели  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
DECLARE @D DATETIME;
SET @D=GETDATE();

SELECT
 CONVERT(CHAR(10),@D,104)[Дата],
 1+DATEDIFF(WEEK, DATENAME(YEAR,@D), DATEADD(DAY,-1,@D))[№ недели];
Результат не зависит от SET DATEFIRST и SET LANGUAGE
21 фев 08, 17:22    [5324415]     Ответить | Цитировать Сообщить модератору
 Re: номер недели  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
pkarklin
ветерочек
это я к тому что datepart(ww,'20040105') - 2 неделя


Вторая. Что не так?
13.01.2008 - 2-я неделя, если считать "по-русски", с понедельника
21 фев 08, 17:28    [5324448]     Ответить | Цитировать Сообщить модератору
 Re: номер недели  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
2Ziks: тема, вообще-то, не нова.
Смотрите, например, Формат ДАТЫ в SQL
Там, кстати, и о номере недели по ISO8601 говорили. Может, Вам именно он нужен?
21 фев 08, 17:54    [5324656]     Ответить | Цитировать Сообщить модератору
 Re: номер недели  [new]
Oldschool
Member

Откуда:
Сообщений: 12
А если так:

{fn week('дата')}

Пойдёт?
З.Ы.: 2000-й
21 фев 08, 18:49    [5324990]     Ответить | Цитировать Сообщить модератору
 Re: номер недели  [new]
_Monah_
Member

Откуда: Минск
Сообщений: 199
Есть вот такое вот разбиение на производственные недели

create function [dbo].[fnGetWeek](
	@Time datetime)
returns int
AS
 Begin	
	declare @week int
	declare @bYearLeap bit
	select @bYearLeap = 0
	
	declare @bPreviousYearLeap bit
	select @bPreviousYearLeap = 0
	
	declare @Jan1WeekDay int
	declare @WeekDay int
	declare @year int 
	declare @day int
	
	declare @YY int
	declare @C int
	declare @G int
	declare @H int
	declare @I int
	declare @J int
		
	select @year = datepart( yy, @time)
	select @day = datepart( y, @time)
	
	if ((@year % 4 = 0 and @year % 100 <> 0) or @year % 400 = 0) select @bYearLeap = 1
	
	if (((@year - 1) % 4 = 0 and (@year - 1) % 100 <> 0) or (@year - 1) % 400 = 0) select @bPreviousYearLeap = 1
	
	select @YY = (@year - 1) % 100
	select @C = (@year - 1) - @YY
	select @G = @YY + CAST((@YY / 4) as int)
	select @Jan1WeekDay = 1 + (((((@C / 100) %4) * 5) + @G) % 7)
	select @H = @day + (@Jan1WeekDay - 1)
	
	select @WeekDay = 1 + ((@H - 1) % 7)
	
	if @day <= (8 - @Jan1WeekDay) and @Jan1WeekDay > 4
	 Begin
		select @year = @year - 1
		if  ((@Jan1WeekDay = 5) or (@Jan1WeekDay = 6 and @bPreviousYearLeap = 1)) select @week = 53	
		else select @week = 52
	 End
	
	if (@year = datepart( yy, @time))
	 Begin
		if @bYearLeap = 1 select @I = 366
		else select @I = 365
	
		if (@I - @day) < (4 - @WeekDay)
		 Begin
		     select @year = @year + 1
		     select @week = 1
		 End
	
	 End
	
	if (@year = datepart( yy, @time))
	 Begin
		select @J = @day + (7 - @WeekDay) + (@Jan1WeekDay - 1)
		select @week = CAST(@J / 7 as int)
	
		if (@Jan1WeekDay > 4) select @week = @week - 1
	 End
	
	return @week
 End
GO
21 фев 08, 18:53    [5325026]     Ответить | Цитировать Сообщить модератору
 Re: номер недели  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iap
DECLARE @D DATETIME;
SET @D=GETDATE();

SELECT
 CONVERT(CHAR(10),@D,104)[Дата],
 1+DATEDIFF(WEEK, DATENAME(YEAR,@D), DATEADD(DAY,-1,@D))[№ недели];
Результат не зависит от SET DATEFIRST и SET LANGUAGE
Оказывается, этот вариант работает неправильно, если год начинается в воскресенье
Зато вот этот (правда, выглядит громоздко) работает всегда - я проверил:
DECLARE @D DATETIME;
SET @D=GETDATE();

SELECT CONVERT(CHAR(10),@D,104)[Дата],
 1-(1+(15-@@DATEFIRST-DATEPART(WEEKDAY, DATENAME(YEAR,@D)))%7)/7+
 DATEDIFF(WEEK, DATEADD(DAY,(16-@@DATEFIRST-DATEPART(WEEKDAY, DATENAME(YEAR,@D)))%7-2, DATENAME(YEAR,@D)), DATEADD(DAY,-1,@D))[№ недели];
22 фев 08, 11:39    [5327257]     Ответить | Цитировать Сообщить модератору
 Re: номер недели  [new]
iSestrin
Member

Откуда: Новосибирск
Сообщений: 3811
многа букф

select datepart(dy,'20080113')/7+1
22 фев 08, 11:54    [5327385]     Ответить | Цитировать Сообщить модератору
 Re: номер недели  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iSestrin
многа букф

select datepart(dy,'20080113')/7+1
Это решение работает абсолютно правильно только для 2008 года (забавное совпадение). Можно привести много дней, для которых номер недели определяется неправильно этим способом. Например:

'20050103'
'20060102'
'20070107'
'20090105'
22 фев 08, 12:50    [5327936]     Ответить | Цитировать Сообщить модератору
 Re: номер недели  [new]
iSestrin
Member

Откуда: Новосибирск
Сообщений: 3811
решение соответствует задаче - "недели, отсчет начиная с начала года: тоесть 01,01,2007 это первая неделя", т.е. начинать считать не с какогото конкретного дня недели, а с 1 янв
22 фев 08, 12:55    [5327987]     Ответить | Цитировать Сообщить модератору
 Re: номер недели  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iSestrin
решение соответствует задаче - "недели, отсчет начиная с начала года: тоесть 01,01,2007 это первая неделя", т.е. начинать считать не с какогото конкретного дня недели, а с 1 янв
То есть, по-Вашему, например, суббота может получить тот же номер недели, что и следующий за ней понедельник? Тогда непонятно, что Вы называете "неделей".
22 фев 08, 13:31    [5328342]     Ответить | Цитировать Сообщить модератору
 Re: номер недели  [new]
iSestrin
Member

Откуда: Новосибирск
Сообщений: 3811
так и есть, может.

неделя - это 7 дней.
22 фев 08, 13:37    [5328393]     Ответить | Цитировать Сообщить модератору
 Re: номер недели  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iSestrin
так и есть, может.

неделя - это 7 дней.
То есть фраза "неделя начинается в понедельник" не имеет смысла?
22 фев 08, 13:56    [5328525]     Ответить | Цитировать Сообщить модератору
 Re: номер недели  [new]
iSestrin
Member

Откуда: Новосибирск
Сообщений: 3811
она имеет ровно столько же смысла, как и команда SET datefirst
22 фев 08, 14:03    [5328589]     Ответить | Цитировать Сообщить модератору
 Re: номер недели  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iSestrin
она имеет ровно столько же смысла, как и команда SET datefirst
Перечитал ещё раз первое сообщение темы. Кажется, вы правы, автору хотелось именно то, о чём Вы говорили. Тогда непонятно, в чём была проблема.
Я-то думал, что 1 января всегда принадлежит первой (возможно неполной) неделе, и все недели начинаются в понедельник.
22 фев 08, 14:12    [5328677]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: номер недели  [new]
smoyk
Member

Откуда: Кемерово
Сообщений: 1057
Я некро... эээ... реаниматор, гыгы)

Подскажите, почему сегодня команда
SET DATEFIRST 1;
select DATEPART(wk,GetDate())
возвращает 21? Тогда как висящий передо мной календарь утверждает, что неделя таки 20я... где я туплю?)
17 май 11, 12:31    [10663849]     Ответить | Цитировать Сообщить модератору
 Re: номер недели  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
smoyk, а у меня висит календарь, и на нем 21 неделя начинается 16 мая 2011 и заканчивается 22 мая 2011.
17 май 11, 12:41    [10663915]     Ответить | Цитировать Сообщить модератору
 Re: номер недели  [new]
Glory
Member

Откуда:
Сообщений: 104751
smoyk
Я некро... эээ... реаниматор, гыгы)

Подскажите, почему сегодня команда
SET DATEFIRST 1;
select DATEPART(wk,GetDate())
возвращает 21? Тогда как висящий передо мной календарь утверждает, что неделя таки 20я... где я туплю?)

Есть несколько стандартов определения номера недели
17 май 11, 12:41    [10663919]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить