金融周编号和年份的DateAdd和DateDiff

时间:2019-02-22 20:20:38

标签: sql-server tsql date week-number financial

我已经看到并使用了各种形式的DateAdd和DateDiff来剥离时间,到达任何月份的第一天或移动日期。

我看到执行这些计算时,经常使用的模式如下:

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

我知道DateDiff表达式内的0是“ 1900年1月1日”。 它首先获取当月与“ 1900年1月1日”之间MONTHS的日期差。然后将月份数加回到“ 1900年1月1日”,这样就可以松散日期信息,并默认为月份的1。

我已经在Google上进行了搜索,还尝试使用上述技术来找出一种方法,以便可以确定“四月的第一个星期五”的日期。下面的代码段是不正确的,但我希望可以使用类似下面的内容来查找财务周和年份:

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

我最终需要做的是找出给定日期范围内的所有财政周数字(以及相应的财政年度)。

第一个财务周从“ 4月的第一个星期五” 开始。第二周从下一个星期五开始,依此类推。

我知道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

2 个答案:

答案 0 :(得分:0)

这将为您提供4月的第一个星期五的日期,作为'theyear'的函数。从本质上讲,它会将星期五工作日数(6)与4月1日的工作日数与给定年份的4月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))

答案 1 :(得分:0)

我无法完全按照自己想要的方式解决此问题,但是我需要完成此工作,因此我编写了一些其他脚本来帮助我解决这个问题。 I have posted it here.