我已经看到并使用了各种形式的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表可以提供服务,并且生产力更高,但是我现在真的很想找到一种方法来执行此操作。
我已经编写了一个表值函数,该函数将生成日历的数据集,但是我需要从上面所述的逻辑中添加以下两列以使其完整:
下面是我到目前为止编写的代码:
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
答案 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.