Mysql 闰年

Mysql 闰年,mysql,Mysql,我有一个名为reviews的MySql表,它存储了许多产品评论,这些评论是多年积累的,每个评论都带有日期时间戳。 我想画一个条形图,显示我一年中每天累积的评论数量,希望找到我的系统的重要日期 我使用了这个查询 select dayofyear(date),count(*) from reviews group by dayofyear(date); 然而,在注意到返回的是366行而不是365行之后,我意识到我不能用它来制作这张图表,因为每闰年的日指数都会被1抵消,这使我的数据倾斜 例如,圣诞节

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

我使用了这个查询

select dayofyear(date),count(*) from reviews group by dayofyear(date);
然而,在注意到返回的是366行而不是365行之后,我意识到我不能用它来制作这张图表,因为每闰年的日指数都会被1抵消,这使我的数据倾斜

例如,圣诞节在大多数年份显示为359天,但在闰年显示为360天

解决这种偏差的最简单方法是什么


另一方面,当条形图有意义时,是否有任何软件包可以接受SQL查询并直接以条形图的形式返回结果

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

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;

这样可以避免所有问题,但在应用程序逻辑中处理可能会更复杂。尽管如此,我还是认为这是一种更好的方法。

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

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;

这样可以避免所有问题,但在应用程序逻辑中处理可能会更复杂。尽管如此,我还是认为这是一种更好的方法。

按月日分组,每个月冲洗并重复?

按月日分组,每个月冲洗并重复