【发布时间】: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 表可以发挥作用并且效率更高,但我现在真的很想找到一种方法来做到这一点。
我已经编写了一个表值函数,该函数将生成日历的数据集,但我需要从上述逻辑中添加以下两列以使其完整:
- 金融周数
- 财政年度
下面是我目前写的代码:
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