DateAdd и DateDiff для номера финансовой недели и года - PullRequest
0 голосов
/ 22 февраля 2019

Я видел и использовал различные формы 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. FinancialYear

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

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

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

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

0 голосов
/ 24 февраля 2019

Это даст вам дату первой пятницы апреля как функцию «они».По существу, это добавляет разницу между номером дня недели в пятницу (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))
...