繁体   English   中英

MySql 闰年

[英]MySql Leap Years

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

我用这个查询

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

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

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

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

在旁注中,是否有任何软件 package 可以接受 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;

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

按月将它们分组,每个月冲洗并重复一次?

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中用function找闰年,我用的最多的是(workbench)。 编写并执行此代码后,您可以看到在左侧创建了 function,架构中有闰年。

您需要拨打此 function 才能查看此 function 的 output。请拨打此 function。

SELECT leap_year(2023);

一旦你点击上面的线并看到 output 将显示“0”,这意味着 2023 年不是闰年。

我希望你明白这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM