【发布时间】:2015-09-23 07:52:58
【问题描述】:
我的一个客户(出于奇怪的财务原因)将财务月定义为 从一个月的最后一个星期二(含)之后的星期三开始并持续到下个月的最后一个星期二的时间段(含)。
我需要找到上一个和当前财政月份的开始日期。
一些例子:
如果今天是 2015 年 9 月 23 日,我需要得到 7 月 29 日和 8 月 26 日,因为当前的财政月份是从 8 月 26 日到 9 月 29 日。
如果今天是 2015 年 9 月 30 日,我需要得到 8 月 26 日到 9 月 30 日。
我有不同的客户,他们有不同的定义,这意味着他们中的一些人使用星期三,其他人使用星期一,所以我需要将这一天作为参数,比如星期一 = 1 和星期三 = 3。我称之为 FDOM,FirstDayOfMonth .
到目前为止,我的工作重点是使用我在当前和上个月的第一天和最后一天找到的公式,并进行了修改以考虑 FDOM。我设法得到了上个月的最后一个星期三,但这有时是不正确的,因为我正在考虑一个月中属于太阳月但也属于下一个财政月的一天,比如 9 月 30 日属于太阳 9 月但属于财政 10 月, 10 月财政从 9 月 30 日开始。
DECLARE @BASE AS DateTime = '19000101 00:00'
DECLARE @FDOM AS INT = 3 --Wednesday
DECLARE @Datevalue AS DATE = GETDATE()
SET DATEFIRST @FDOM
select DATEADD(D,1-(DATEPART(dw,DATEADD(D,-1,DATEADD(MONTH, DATEDIFF(MONTH, @BASE, @Datevalue) , @BASE)))),DATEADD(D,-1,DATEADD(MONTH, DATEDIFF(MONTH, @BASE, @Datevalue) , @BASE)))
这给了我上个月最后一个星期二之后的第一个星期三,从 9 月 1 日到 9 月 29 日(它给 8 月 26 日)作为“当前财政月的开始”是正确的。但它在 9 月 30 日是错误的,因为它应该给出 9 月 30 日,并且从 8 月 26 日到 8 月底也是错误的,因为它应该给出 8 月 26 日,但是却给出了 7 月 29 日。
【问题讨论】:
-
那么 2015 年 4 月的财务数据是从 4 月 1 日到 4 月 28 日(但您想找到 4 月 1 日和 4 月 29 日的日期)?
-
如果今天是4月29日到5月26日(含)我需要拿到4月1日到4月29日,是的
-
换句话说:我正在为 SSRS 创建订阅,当我运行报告时,我需要它大约是最后一个完整的财政月。因此,如果我从 4 月 29 日到 5 月 26 日(含)运行它,那么最后一个完整的财政月应该是财政 4 月,即从 4 月 1 日(含)到 4 月 29 日(不含)
-
无论如何,不要专注于我谈到 SSRS 的事实。我正在寻找的公式应该是通用的,我应该能够在任何地方使用它,这就是为什么我强迫自己避免 CTE 和自定义函数,因为我不知道我是否总是被允许使用它们。我认为一个 CASE 应该足以处理 今天 是一个太阳月的一部分,同时又是下一个财政月的一部分
-
您的意思是“2015 年 8 月 23 日”而不是“2015 年 9 月 23 日”,对吧?
标签: sql-server tsql date financial