DateAdd и DateDiff для номера и года финансовой недели

Я видел и использовал различные формы DateAdd и DateDiff для выделения времени, перехода к первому дню любого месяца или перемещения даты.

Я вижу, что при выполнении этих расчетов часто используется следующий шаблон:

select DATEADD(m, DATEDIFF(m,0,GETDATE() ), 0) as 'Beginning of the month'

Я знаю, что 0 внутри выражения DateDiff - это «1 января 1900 года». Сначала он получает разницу в дате в МЕСЯЦАХ между текущим месяцем и «1 января 1900». Затем добавляется количество месяцев к «1 января 1900», таким образом теряется информация о дне и по умолчанию устанавливается 1 число месяца.

Я погуглил, а также попробовал себя, используя описанную выше технику, чтобы найти способ, с помощью которого я могу узнать дату, когда это «первая пятница апреля». Приведенный ниже фрагмент неверен, но я надеялся, что может быть что-то вроде приведенного ниже, чтобы найти финансовую неделю и год:

DATEADD(WEEK, DATEDIFF(WEEK, 0, GETDATE()), 0)

Что мне в конечном итоге нужно сделать, так это узнать номера всех финансовых недель (и соответствующего финансового года) для любого заданного диапазона дат.

Первая финансовая неделя начинается с 1-й пятницы апреля. Вторая неделя начинается со следующей пятницы и так далее.

Я понимаю, что таблица DATE будет работать и будет намного более продуктивной, но я действительно хотел бы найти способ сделать это на данный момент.

Я написал функцию с табличным значением, которая будет создавать набор данных календаря, но мне нужно добавить следующие два столбца из логики, которую я изложил выше, чтобы сделать ее завершенной:

  1. FinancialWeekNumber
  2. Финансовый год

Ниже приведен код, который я написал до сих пор:

create function [dbo].[MyDailyDateTable]
      (@StartDate datetime, @EndDate datetime)          returns @DailyDates table (
    DailyDatesID int identity,
    DailyDate date, 
    DayNumber int,
    DayName varchar(50),
    WeekNumber int,
    QuaterNumber int,
    MonthNumber int,
    MonthCalled varchar(50),
    YearNumber int

    ---- FinancialWeekNumber
    ---- FinancialYear ) AS BEGIN

    while (@StartDate <= @EndDate)
    begin
        insert into @DailyDates
        select  @StartDate DailyDate
             , datename(day, @StartDate) DayNumber 
                , datename(dw, @StartDate) DayName 
             , DATEPART(dw, @StartDate) DayOfTheWeek -- Default 1 = Monday is used ("SET DATEFIRST 1")
                , datepart(week, @StartDate) WeekNumber
             , DATEPART(qq , @StartDate) as QuarterValue 
                , datepart(month,@StartDate) MonthNumber
                , datename(month,@StartDate) MonthCalled
                , YEAR(@StartDate) YearNumber

             ---- FinancialWeekNumber
             ---- FinancialYear

        set @StartDate = dateadd(day, 1 ,@StartDate)
    end

    return END

person Unbound    schedule 22.02.2019    source источник
comment
Хорошо, если вы сделаете датировку в определенный день с 1 апреля, это даст вам количество дней. просто разделите количество дней на 7, округленное в меньшую сторону, как целое число, затем добавьте 1. Что еще есть? Я что-то упускаю? (Получите часть года для даты, которую вы обрабатываете, создайте дату для 1 апреля этого года - и сделайте dateiff для этих двух)   -  person JGFMK    schedule 23.02.2019
comment
это первая пятница апреля, которая будет в разные дни апреля в разные годы.   -  person Unbound    schedule 24.02.2019
comment
mathforum.org/dr.math/faq/faq.calendar.html   -  person JGFMK    schedule 24.02.2019


Ответы (2)


Это даст вам дату первой пятницы апреля в зависимости от «года». По сути, он добавляет разницу между номером дня недели пятницы (6) и номером дня недели 1 апреля к дате 1 апреля данного года. (Предполагается, что воскресенье = 1). Затем номер недели может быть получен из рассчитанной даты для этой недели или любой другой недели.

declare @theyear int
set @theyear = datepart(yy,getdate())

select dateadd(day, 
    case when (6 - datepart(dw, datefromparts(@theyear, 4, 1))) < 0 then 6 
    else (6 - datepart(dw, datefromparts(@theyear, 4, 1))) end, 
    datefromparts(@theyear, 4, 1))
person J.R.    schedule 24.02.2019
comment
Ты прав; Я отредактировал ответ, чтобы справиться с ситуацией, когда номер дня недели становится отрицательным. - person J.R.; 25.02.2019

Я не мог решить это так, как я хотел, но мне нужно было это сделать, поэтому я написал другой сценарий, чтобы помочь мне с этим. Я разместил это здесь.

person Unbound    schedule 26.02.2019