Получение номера недели с даты в MS SQL Server 2005?
Можно ли создать оператор sql, который выбирает номер недели (НЕ день недели или номер дня в неделю). Я создаю представление для выбора этой дополнительной информации вместе с несколькими другими полями и, следовательно, не могу использовать хранимую процедуру. Я знаю, что можно создать UDF, чтобы сделать трюк, но если это вообще возможно, я бы предпочел только добавить представление к этой базе данных, чем представление и функцию.
Любые идеи? Также, где я родом, неделя начинается в понедельник, а 1-я неделя - первая неделя года, по крайней мере, 4 дня.
Связанный:
Как рассчитать номер недели с датой?
Ответы
Ответ 1
Имейте в виду, что существуют различия в том, что считается правильным числом в неделю, в зависимости от культуры. Число недель зависит от нескольких допущений, которые отличаются от страны к стране, см. Статья в Википедии по этому вопросу. Существует стандарт ISO (ISO 8601), который применяется к номерам недель.
Интегрированная функция SQL DATEPART()
, встроенная в SQL Server, не обязательно делает "Правильную вещь". SQL Server предполагает, что день 1 недели 1 будет 1 января, для многих приложений, которые ошибочны.
Вычисление правильных чисел недели является нетривиальным, и различные варианты реализации можно найти в Интернете. Например, существует UDF, который вычисляет номера недели ISO с 1930 по 2030 год, являясь одним из многих других. Вам нужно будет проверить, что работает для вас.
Это из Books Online (хотя вы, вероятно, захотите использовать тот, который принадлежит Jonas Lincoln answer, версия BOL кажется неправильной):
CREATE FUNCTION ISOweek (@DATE DATETIME)
RETURNS INT
AS
BEGIN
DECLARE @ISOweek INT
SET @ISOweek = DATEPART(wk,@DATE)
+1
-DATEPART(wk,CAST(DATEPART(yy,@DATE) AS CHAR(4))+'0104')
-- Special cases: Jan 1-3 may belong to the previous year
IF (@ISOweek=0)
SET @ISOweek = dbo.ISOweek(CAST(DATEPART(yy,@DATE) - 1
AS CHAR(4))+'12'+ CAST(24+DATEPART(DAY,@DATE) AS CHAR(2)))+1
-- Special case: Dec 29-31 may belong to the next year
IF ((DATEPART(mm,@DATE)=12) AND
((DATEPART(dd,@DATE)-DATEPART(dw,@DATE))>= 28))
SET @ISOweek=1
RETURN(@ISOweek)
END
GO
Ответ 2
Вам нужна неделя ISO. Из http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=60510 здесь реализована реализация:
drop function dbo.F_ISO_WEEK_OF_YEAR
go
create function dbo.F_ISO_WEEK_OF_YEAR
(
@Date datetime
)
returns int
as
/*
Function F_ISO_WEEK_OF_YEAR returns the
ISO 8601 week of the year for the date passed.
*/
begin
declare @WeekOfYear int
select
-- Compute week of year as (days since start of year/7)+1
-- Division by 7 gives whole weeks since start of year.
-- Adding 1 starts week number at 1, instead of zero.
@WeekOfYear =
(datediff(dd,
-- Case finds start of year
case
when NextYrStart <= @date
then NextYrStart
when CurrYrStart <= @date
then CurrYrStart
else PriorYrStart
end,@date)/7)+1
from
(
select
-- First day of first week of prior year
PriorYrStart =
dateadd(dd,(datediff(dd,-53690,dateadd(yy,-1,aa.Jan4))/7)*7,-53690),
-- First day of first week of current year
CurrYrStart =
dateadd(dd,(datediff(dd,-53690,aa.Jan4)/7)*7,-53690),
-- First day of first week of next year
NextYrStart =
dateadd(dd,(datediff(dd,-53690,dateadd(yy,1,aa.Jan4))/7)*7,-53690)
from
(
select
--Find Jan 4 for the year of the input date
Jan4 =
dateadd(dd,3,dateadd(yy,datediff(yy,0,@date),0))
) aa
) a
return @WeekOfYear
end
go
Ответ 3
Похоже, функция DATEPART mssql должна помочь вам с...
DATEPART(wk, ‘Jan 1, xxxx’) = 1
Ну, я стану... выясняется, что есть способ установить первый день недели, DATEFIRST
SET DATEFIRST 1 -- for monday
Обновление: теперь я лучше понимаю, что хочет OP.., который является настраиваемой логикой для этого. Я не думаю, что MSSQL будет иметь функции с таким богатым уровнем настройки. Но я, возможно, ошибаюсь... Я думаю, вам придется катить свой UDF здесь... извините
Ответ 4
Это вернет вам номер недели, введенный в кавычки
SELECT DATEPART( wk, 'enter the date over here' )
Ответ 5
ЗАБУДЬТЕ ДРУГИЕ ОТВЕТЫ
В вопросе указывается " неделя начинается в понедельник, а неделя 1 - первая неделя года, по крайней мере, 4 дня." Это стандарт ISO 8601 и что этот ответ обеспечивает. Эта функция используется в производстве на нашем сайте.
Это все, что вам нужно:
CREATE FUNCTION ISOweek (@DATE DATETIME)
RETURNS INT
AS
BEGIN
RETURN (datepart(DY, datediff(d, 0, @DATE) / 7 * 7 + 3)+6) / 7
END
GO
Ответ 6
Похоже, что datepart поможет вам в этом, но вам придется приспособиться, чтобы получить правильный номер недели, основанный на дне недели 1 января текущего года. Я недостаточно хорошо знаком с T-SQL, но это должно быть возможно. Жаль, что нет аргумента режима, как в MySQL
Ответ 7
Считаете ли вы использование функции WEEK?
Это даст вам неделю года для указанной даты, в которую вы проходите.
SELECT { fn WEEK(GETDATE()) } AS WeekNumber, { fn WEEK(CONVERT(DATETIME, '2008-01-01 00:00:00', 102)) } AS FirstWeekOfYear, { fn WEEK(CONVERT(DATETIME, '2008-12-31 00:00:00', 102)) } AS LastWeekOfYear
Здесь выводятся следующие SQL2000 и SQL2005:
- WeekNumber: 50
- FirstWeekOfYear: 1
- LastWeekOfYear: 53
Надеюсь, это поможет:)
Ответ 8
Почему еще раз люди делают горы из молевых холмов, это меня поражает?
Так просто...
select DATEPART(wk, GETDATE())