除以未引用正确月份/天数的天数

时间:2015-09-29 19:51:25

标签: sql sql-server sql-server-2008

我有一张表,用户输入每日人口。那天特定设施中有多少人。该表看起来类似于:

select * from stat_summary where MONTH(report_date) = 9

结果:

stat_summary_id | report_date | facility | adp
----------------------------------------------------
29              |2015-09-01   | YORK     |  1855
30              |2015-09-02   | YORK     |  1750
31              |2015-09-04   | YORK     |  1655
32              |2015-09-04   | YORK     |  1699

我想要做的是计算按月分组的平均每日人口数。如果必须重新输入更正的值,我想采用MAX(report_date)。我的查询如下:

SELECT
    MONTH(t.report_date) as 'report_month',
    SUM(ss1.adp)/DAY(DATEADD(DD,-1,DATEADD(MM,DATEDIFF(MM,-1,MONTH(t.report_date)),0))),
    DAY(DATEADD(DD,-1,DATEADD(MM,DATEDIFF(MM,-1,MONTH(t.report_date)),0)))
FROM
    stat_summary ss1
    INNER JOIN 
    (SELECT MAX(stat_summary_id) as 'stat_summary_id', report_date  
     FROM stat_summary  
     GROUP BY report_date       
     ) t ON t.stat_summary_id = ss1.stat_summary_id
WHERE
    ss1.facility_id = 'YORK'
    AND MONTH(t.report_date) = 9
GROUP BY    
    MONTH(t.report_date)
ORDER BY
    MONTH(t.report_date)

我引用了这个帖子: Dividing a value by number of days in a month in a date field in SQL table

我能够看到如何动态划分当月的天数,但看起来它除以当前月份(10月)有31天,当我需要查询除以引用月份为9月,有30天。

目前我的搜索结果如下:

enter image description here

adp值应为176.8,因为9月份有30天,而不是31天。

2 个答案:

答案 0 :(得分:0)

如此快速检查看起来这个公式在所有月份都会返回31。可在此处找到正确的公式:How to determine the number of days in a month in SQL Server?

datediff(day, dateadd(day, 1-day(@date), @date),
          dateadd(month, 1, dateadd(day, 1-day(@date), @date)))

更精确地使用:

datediff(day, dateadd(day, 1-day(MIN(t.report_date)), MIN(t.report_date)),
          dateadd(month, 1, dateadd(day, 1-day(MIN(t.report_date)), MIN(t.report_date))))

编辑:请注意原始公式实际上是正确的,问题是你在一个月而不是一天过去了。月份是1-12的数字,所以你的所有日期都是1月份。

答案 1 :(得分:0)

我应该使用

day(DateAdd(day, DateAdd(month, MONTH(t.report_date), DateAdd(Year, YEAR(t.report_date)-1900, 0)), -1)) as monthDays

另外听起来,为了获得平均值,除以该数字是错误的,只有当记录数与月中的天数匹配时才是正确的,在其他情况下,只是计数就足够了

SUM(ss1.adp)/count(ss1.adp) as average