MySql 闰年

问题描述 投票:0回答:4

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

我使用了这个查询

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

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

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

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

顺便说一句,是否有任何软件包可以接受 SQL 查询并直接以条形图形式返回结果(当条形图有意义时)

mysql
4个回答
4
投票

我还没有测试过这个,但你可以这样做:

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
投票

按月中的某一天对它们进行分组,然后每个月进行冲洗和重复?


0
投票
  1. 想想闰年的特点。

  2. 闰年,二月有 29 天。

检查日期(例如

mydate
字段)是否为闰年。使用以下条件。

DAY(LAST_DAY(DATEMAKE(YEAR(mydate),2))) = 29

完整的MySQL语句

SELECT 
    IF(DAY(LAST_DAY(DATEMAKE(YEAR(mydate),2))) = 29,
        IF(DAYOFYEAR(mydate) > DAYOFYEAR("2008-02-28"), DAYOFYEAR(mydate) - 1, DAYOFYEAR(mydate)),
        DAYOFYEAR(mydate))
FROM mytbl

  1. 一个月有多少天,请参阅stackoverflow

  2. 如何在MySQL中创建新日期,请参阅w3school


-1
投票
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)中的函数来查找闰年。编写此代码并执行此代码后,您可以看到该函数在左侧创建,并且模式中带有“leap_year”。

您需要调用该函数才能看到该函数的输出。 用于调用此函数。

SELECT leap_year(2023);

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

我希望你能理解这一点。

© www.soinside.com 2019 - 2024. All rights reserved.