SQL日期函数

时间:2011-07-14 19:49:15

标签: sql function date

我可能使用了错误的术语(因此我无法在谷歌上找到它)。

“会计月减少是否有任何功能或通用代码?”

例如,这个月开始于周五,但在大多数会计期刊上,周数是按月的第一个星期一来衡量的,所以不是7月1日,而是7月4日。与月末相同(29日而不是31日)

同样,我确信有人之前创造了这个“轮子”,而且我似乎无法在我的生命中找到它。

2 个答案:

答案 0 :(得分:1)

以下查询假设一个表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语句检测到该场景,如果是,则在计算第一个星期一之前减去该日期的一周。

祝你好运!

- 迈克尔

答案 1 :(得分:0)

我有一些年份和月份的代码,并返回财务开始和结束日期。也许这会给你一些东西:

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