SQL日期函数

SQL日期函数,sql,function,date,Sql,Function,Date,我可能使用了错误的术语(因此我无法在谷歌上找到它) “会计月除名是否有任何功能或通用代码?” 例如,本月从星期五开始,但在大多数会计日记帐中,周数是以本月的第一个星期一计算的,因此,7月1日不是7月1日,而是7月4日。月末也是一样(29日而不是31日) 再说一遍,我确信以前有人创建过这个“轮子”,而我似乎一辈子都找不到它。我有一些代码,它包含一年和一个月,并返回财政开始和结束日期。也许这会给你一些依据: DECLARE @yr int; DECLARE @mo int; SELECT @yr =

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

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

例如,本月从星期五开始,但在大多数会计日记帐中,周数是以本月的第一个星期一计算的,因此,7月1日不是7月1日,而是7月4日。月末也是一样(29日而不是31日)


再说一遍,我确信以前有人创建过这个“轮子”,而我似乎一辈子都找不到它。

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

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

下面的查询假设一个名为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
它接受任何日期并返回该日期所在月份的第一个星期一。然而,在您的情况下,您必须做更多的工作,因为销售可能发生在月初和月初的第一个星期一之间的窗口中。CASE语句检测到该场景,如果是真的,则在计算第一个星期一之前减去日期的一周

祝你好运


-Michael

您会称之为会计月吗?也许,它在我的文档中显示为会计月。(我将通过财政月去谷歌看看我发现了什么)我不知道有什么现成的方法可以做你所做的事情,但是有各种各样的函数和例程可以用来查找给定月份的第一个星期一。假设您可以使用这些来预填充一个表,该表将日历日期映射到相应的会计月份,然后在代码中创建一个用户函数来映射live。但如果你举个例子说明你想做什么;i、 例如,您正在尝试编写什么代码以及在哪里遇到问题,我可能会更有帮助?无法在当前环境中创建表(DBA正在休假)。我主要是查询每个会计月的销售总额。因此,您可以从(Area_52)查询一个Select Sum(amount),其中(在此处创建奇特的会计月表达式)如果有帮助,我可以使用pl/sql、t-sql或teradata,如果您愿意的话。我支持使用日历文件-它在一系列转换设置(ISO/Gregorian日历和会计日历之间)中变得非常有用。允许按财政日历的随机部分进行汇总和选择(“嘿,对于所有以前的财政年度,第三个财政月的第四个财政周是什么样的”)。根据需要,您可以在若干年内预生成该文件,并将所有日期作为ISO日期或日历文件中的id存储在其他文件中(通常显示在星型架构中)。参考:
DATEADD(WEEK, DATEDIFF(WEEK, 0, DATEADD(DAY, 6 - DATEPART(DAY, s.SaleDate ),s.SaleDate )), 0)