消除每月总计的偏差

时间:2010-02-03 17:27:07

标签: sql select group-by sybase

为了消除由月份和年份的天数差异(闰年)引起的偏差,从每月的任意数量的总比较中,并假设,例如,一个名为{{1的表格使用名为My_Table的日期时间列和名为order_date的整数列,我使用以下查询来获得无偏的月收入总额:

revenue

我想要你的意见或其他做法

2 个答案:

答案 0 :(得分:1)

滚动自己的日历计算可能很难。使用内置函数可能更可靠。

例如,您可以找到任何月份的第一天,例如:

DATEADD(mm, DATEDIFF(m,0,DateColumn),0)

在两者之间执行datediff可以获得该月的天数。多年来你也可以这样做:

select 
    datediff(d,
        DATEADD(mm, DATEDIFF(mm,0,getdate()),0),
        DATEADD(mm, DATEDIFF(mm,0,getdate())+1,0)) 
        as NumOfDaysThisMonth,
    datediff(d,
        DATEADD(yy, DATEDIFF(yy,0,getdate()),0),
        DATEADD(yy, DATEDIFF(yy,0,getdate())+1,0)) 
        as NumOfDaysThisYear

此示例适用于SQL Server,希望在Sybase上有一个等效的内容:)

答案 1 :(得分:0)

我假设你使用的是SQL Server,因为这似乎是我所知道的唯一使用datepart()的系统。

在oracle和MySQL中,你有一个LAST_DAY()函数。我找到了与SQL Server here等效的用户定义函数:

CREATE FUNCTION [dbo].[ufn_GetLastDayOfMonth] ( @pInputDate    DATETIME )
RETURNS DATETIME
BEGIN

    DECLARE @vOutputDate        DATETIME

    SET @vOutputDate = CAST(YEAR(@pInputDate) AS VARCHAR(4)) + '/' + 
                       CAST(MONTH(@pInputDate) AS VARCHAR(2)) + '/01'
    SET @vOutputDate = DATEADD(DD, -1, DATEADD(M, 1, @vOutputDate))

    RETURN @vOutputDate

END 
GO

您可以添加该功能,然后使用它来简化查询。