MySql闰年

时间:2009-06-24 00:36:32

标签: mysql

我有一个名为review的MySql表,它存储了很多年累积的产品评论,每个评论都带有日期时间戳。
我想绘制一个条形图,显示我在一年中的每一天积累的评论数量,希望找到我系统的重要日期。

我使用了这个查询

select dayofyear(date),count(*) from reviews group by dayofyear(date);

然而,在注意到它返回366行而不是365之后,我意识到我不能用它来制作这个图表,因为日期索引每闰年都会偏移1,这会使我的数据偏差。

例如,圣诞节在大多数年份都出现在第359天,但在闰年时却是#360。

解决此偏差的最简单方法是什么?

在旁注中,是否有任何软件包可以接受SQL查询并将结果直接作为条形图返回(当条形图有意义时)

2 个答案:

答案 0 :(得分:3)

我没有对此进行测试,但您可以执行以下操作:

SELECT 
        # check if the year is a leap year:
        IF((YEAR(mydate) % 4 = 0 AND YEAR(mydate) % 100 != 0) OR YEAR(mydate) % 400 = 0,
            # if so, check if the date is before or after february 29th. if that is the case, we subtract one from the value
            IF(DAYOFYEAR(mydate) > DAYOFYEAR("2008-02-28"), DAYOFYEAR(mydate) - 1, DAYOFYEAR(mydate)),
            # if the year isn't a leap year, just return the regular dayofyear() value
            DAYOFYEAR(mydate))
    FROM mytbl

这将合并闰年28日和29日的数据,但是对于所有其他日子的闰年和非闰年,给出相同的偏移量。更理想的行为可能是简单地忽略2月29日的数据,这可以使用附加条件来完成。您还可以为其指定一个特殊索引,例如400,它不会抵消所有其他日期。

更好的方法可能是逐月分组:

select month(date) m, day(date) d, count(*) from reviews group by m, d;

这样可以避免所有问题,但是在您的应用程序逻辑中进行处理可能会更复杂。不过,我认为这是一个更好的方法。

答案 1 :(得分:1)

按月份分组,每个月冲洗并重复一次?