MySql闰年

qmelpv7a  于 2023-02-03  发布在  Mysql
关注(0)|答案(3)|浏览(147)

我有一个名为reviews的MySql表,其中存储了许多产品评论,这些评论是多年积累的,每个评论都用日期时间戳进行了注解。
我想画一个条形图,显示我在一年中每天积累的评论数量,希望找到我的系统的重要日期。
我使用了以下查询

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

但是,在注意到返回的是366行而不是365行之后,我意识到我不能用它来制作这个图表,因为每个闰年的日索引都会偏移1,这会扭曲我的数据。
例如,圣诞节在大多数年份显示为第359天,但在闰年显示为第360天。
解决这种偏斜的最简单方法是什么?
在sidenote上,是否有任何软件包可以接受SQL查询并直接以条形图的形式返回结果(如果条形图有意义)

relj7zay

relj7zay1#

我还没有测试过这个,但是你可以做一些类似下面的事情:

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;

这样就避免了所有的问题,但是在应用程序逻辑中处理起来可能会更加复杂,不过,我认为这是一种更好的方法。

vd2z7a6w

vd2z7a6w2#

按月的天分组,每个月都冲洗并重复?

cwxwcias

cwxwcias3#

DELIMITER //
   CREATE FUNCTION leap_year (y INT)
      RETURNS INT
  DECLARE income INT;
      IF (y%4 = 0) THEN
        SET income = TRUE;
      ELSE
        SET income = FALSE;
      END IF;
      RETURN income;
  END; // DELIMITER ;

上面写的代码是使用MySQL Workbench中的函数查找闰年,我经常使用(workbench)。编写并执行此代码后,可以看到在schema中创建了左侧的leap_year函数。
您需要调用此函数才能看到此函数的输出。用于调用此函数。

SELECT leap_year(2023);

一旦你点击上面的线,看到输出会显示“0”,这意味着2023年不是闰年。
我希望你能理解。

相关问题