我可能用错了词(这就是为什么我在谷歌上找不到它)。
“会计月度分隔是否有任何函数或通用代码?”
例如,这个月从周五开始,但在大多数会计期刊上,星期是以当月的第一个星期一计算的,所以不是7月1日,而是7月4日。月末也是一样(29号而不是31号)
再说一次,我敢肯定之前有人创造了这个‘轮子’,我似乎找不到它的生活。
发布于 2011-07-15 05:14:05
下面的查询假设表SalesTable有一个名为Amount的字段(要求和的值)和一个名为SaleDate (发生销售的日期)的字段。它还假设会计月份从该月的第一个星期一开始,并在下一个会计月开始的前一个星期天结束。
同样,我强烈建议使用基于表的方法,但是如果您不能修改模式,那么在T-SQL中应该可以做到这一点:
SELECT
CASE WHEN s.SaleDate < DATEADD(WEEK, DATEDIFF(WEEK, 0, DATEADD(DAY, 6 - DATEPART(DAY, s.SaleDate ),s.SaleDate )), 0)
THEN DATEADD(WEEK, DATEDIFF(WEEK, 0, DATEADD(DAY, 6 - DATEPART(DAY, DATEADD(day,-7,s.SaleDate) ),DATEADD(day,-7,s.SaleDate) )), 0)
ELSE DATEADD(WEEK, DATEDIFF(WEEK, 0, DATEADD(DAY, 6 - DATEPART(DAY, s.SaleDate ),s.SaleDate )), 0)
END AccountingMonth,
SUM(s.Amount) TotalSales
FROM SalesTable s
GROUP BY
CASE WHEN s.SaleDate < DATEADD(WEEK, DATEDIFF(WEEK, 0, DATEADD(DAY, 6 - DATEPART(DAY, s.SaleDate ),s.SaleDate )), 0)
THEN DATEADD(WEEK, DATEDIFF(WEEK, 0, DATEADD(DAY, 6 - DATEPART(DAY, DATEADD(day,-7,s.SaleDate) ),DATEADD(day,-7,s.SaleDate) )), 0)
ELSE DATEADD(WEEK, DATEDIFF(WEEK, 0, DATEADD(DAY, 6 - DATEPART(DAY, s.SaleDate ),s.SaleDate )), 0)
END请注意,AccountingMonth返回字段实际上包含该月的第一个星期一的日期。在实际操作中,您可能希望将整个查询包装在另一个查询中,该查询将AccountingMonth重新格式化为您喜欢的任何格式……"2011-07“、"2011-08”等。
下面是它的工作原理:这段代码是重要的部分:
DATEADD(WEEK, DATEDIFF(WEEK, 0, DATEADD(DAY, 6 - DATEPART(DAY, s.SaleDate ),s.SaleDate )), 0)它接受任何日期,并返回该日期所在月份的第一个星期一。然而,在您的情况下,您必须做更多的工作,因为在这个月的第一个星期一到这个月的第一个星期一之间,可能已经在窗口中发生了销售。CASE语句检测到这种情况,如果是真的,则在计算第一个星期一之前减去日期的一周。
祝好运!
-Michael
发布于 2011-07-15 04:27:02
我有一些代码,它接受一年和一个月,并返回财政开始和结束日期。也许这会给你提供一些依据:
DECLARE @yr int;
DECLARE @mo int;
SELECT @yr = 2011
SELECT @mo = 7
DECLARE @FiscalMonthStartDate datetime
DECLARE @FiscalMonthEndDate datetime
DECLARE @startOfMonth datetime
DECLARE @startOfNextMonth datetime
select @startOfMonth = CAST((CAST(@yr AS VARCHAR(4)) + '-' + CAST(@mo AS VARCHAR(2)) + '-' + '01') as DATE)
select @startOfNextMonth = CAST((CAST(@yr AS VARCHAR(4)) + '-' + CAST((@mo + 1) AS VARCHAR(2)) + '-' + '01') as DATE)
SELECT @FiscalMonthStartDate =
CASE
WHEN DATEPART(DW,@startOfMonth) = 0
THEN DATEADD(DD, 1, @startOfMonth)
ELSE
DATEADD(DD, 8 - DATEPART(DW,@startOfMonth), @startOfMonth)
END
SELECT @FiscalMonthEndDate =
CASE
WHEN DATEPART(DW,@startOfNextMonth) = 0
THEN DATEADD(DD, 1, @startOfNextMonth)
ELSE
DATEADD(DD, 8 - DATEPART(DW,@startOfNextMonth), @startOfNextMonth)
END
-- subtract one day to get end of fiscal month (not start of next fiscal month)
SELECT @FiscalMonthEndDate = DATEADD(DD, -1, @FiscalMonthEndDate)
SELECT @FiscalMonthStartDate, @FiscalMonthEndDatehttps://stackoverflow.com/questions/6699111
复制相似问题