Подтвердить что ты не робот

Получение номера недели с даты в MS SQL Server 2005?

Можно ли создать оператор sql, который выбирает номер недели (НЕ день недели или номер дня в неделю). Я создаю представление для выбора этой дополнительной информации вместе с несколькими другими полями и, следовательно, не могу использовать хранимую процедуру. Я знаю, что можно создать UDF, чтобы сделать трюк, но если это вообще возможно, я бы предпочел только добавить представление к этой базе данных, чем представление и функцию.

Любые идеи? Также, где я родом, неделя начинается в понедельник, а 1-я неделя - первая неделя года, по крайней мере, 4 дня.

Связанный:

Как рассчитать номер недели с датой?

4b9b3361

Ответ 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())