【问题标题】:DateAdd and DateDiff for Financial Week number and Year财务周数和年份的 DateAdd 和 DateDiff
【发布时间】:2019-02-22 20:20:37
【问题描述】:

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

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

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

我知道 DateDiff 表达式中的 0 是“1 Jan 1900”。 它首先获取当前月份和“1900 年 1 月 1 日”之间的 MONTHS 日期差。然后将月数添加回“1900 年 1 月 1 日”,这样它就会丢失日期信息并默认为该月的 1 日。

我已经用谷歌搜索并尝试使用上述技术找出一种方法,我可以通过它找出“四月的第一个星期五”的日期。下面的 sn-p 是不正确的,但我希望可以有类似下面的东西来找到财政周和年:

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

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

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

我知道 DATE 表可以发挥作用并且效率更高,但我现在真的很想找到一种方法来做到这一点。

我已经编写了一个表值函数,该函数将生成日历的数据集,但我需要从上述逻辑中添加以下两列以使其完整:

  1. 金融周数
  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

【问题讨论】:

  • 好吧,如果您在自 4 月 1 日以来的给定日期进行 datediff,这将为您提供天数。只需将天数除以 7 向下舍入为整数,然后加 1。还有什么?我错过了什么吗? (获取您正在处理的日期的年份部分,为该年的 4 月 1 日创建一个日期 - 并对这两者进行 datediff)
  • 这是四月的第一个星期五,不同年份的四月的不同日子。

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


【解决方案1】:

这将为您提供四月第一个星期五的日期,作为“年份”的函数。本质上,它将星期五工作日编号 (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))

【讨论】:

  • 你是对的;我已经编辑了答案以处理工作日数字变为负数的情况。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2021-11-15
    • 2015-07-20
    • 2018-10-05
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    相关资源
    最近更新 更多