我已经看到并使用各种形式的DateAdd和DateDiff来剥离时间,到达任何月份的第一天或者移动日期。
我可以看到,在执行这些计算时,经常使用的模式如下:
select DATEADD(m, DATEDIFF(m,0,GETDATE() ), 0) as 'Beginning of the month'
我知道DateDiff表达式中的0是“1900年1月1日”。它首先获得当月和“1月1900”之间MONTHS的日期差异。然后将月数加回到“1900年1月1日”,这样它就会丢失当天的信息并默认为当月的1。
我用谷歌搜索,并尝试使用上述技术,找到一种方法,我可以找到它是“四月的第一个星期五”的日期。下面的片段不正确,但我希望有类似下面的内容可以找到财务周和年份:
DATEADD(WEEK, DATEDIFF(WEEK, 0, GETDATE()), 0)
我最终需要做的是找出任何给定日期范围的所有财务周数(和相应的财政年度)。
第一个财政周从“四月的第一个星期五”开始。第二周从下周五开始,依此类推。
我知道DATE表会起作用并且效率更高但我现在真的想找到一种方法来做这种方式。
我编写了一个表值函数,它将生成日历的数据集,但我需要在上面提到的逻辑中添加以下两列以使其完整:
下面是我到目前为止编写的代码:
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月的第一个星期五的日期作为'他们'的函数。基本上它增加了星期五工作日数(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))
我无法按照我想要的方式解决这个问题,但我需要完成这个,所以我写了一些其他的脚本来帮助我。 I have posted it here.