首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL Date函数

SQL Date函数
EN

Stack Overflow用户
提问于 2011-07-15 03:49:15
回答 2查看 503关注 0票数 2

我可能用错了词(这就是为什么我在谷歌上找不到它)。

“会计月度分隔是否有任何函数或通用代码?”

例如,这个月从周五开始,但在大多数会计期刊上,星期是以当月的第一个星期一计算的,所以不是7月1日,而是7月4日。月末也是一样(29号而不是31号)

再说一次,我敢肯定之前有人创造了这个‘轮子’,我似乎找不到它的生活。

EN

回答 2

Stack Overflow用户

发布于 2011-07-15 05:14:05

下面的查询假设表SalesTable有一个名为Amount的字段(要求和的值)和一个名为SaleDate (发生销售的日期)的字段。它还假设会计月份从该月的第一个星期一开始,并在下一个会计月开始的前一个星期天结束。

同样,我强烈建议使用基于表的方法,但是如果您不能修改模式,那么在T-SQL中应该可以做到这一点:

代码语言:javascript
运行
复制
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”等。

下面是它的工作原理:这段代码是重要的部分:

代码语言:javascript
运行
复制
DATEADD(WEEK, DATEDIFF(WEEK, 0, DATEADD(DAY, 6 - DATEPART(DAY, s.SaleDate ),s.SaleDate )), 0)

它接受任何日期,并返回该日期所在月份的第一个星期一。然而,在您的情况下,您必须做更多的工作,因为在这个月的第一个星期一到这个月的第一个星期一之间,可能已经在窗口中发生了销售。CASE语句检测到这种情况,如果是真的,则在计算第一个星期一之前减去日期的一周。

祝好运!

-Michael

票数 1
EN

Stack Overflow用户

发布于 2011-07-15 04:27:02

我有一些代码,它接受一年和一个月,并返回财政开始和结束日期。也许这会给你提供一些依据:

代码语言:javascript
运行
复制
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, @FiscalMonthEndDate
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6699111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档