我有一个名为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;
这可以完全避免问题,但可能会让您在应用程序逻辑中处理起来更加复杂。不过,我认为这是更好的方法。
按月中的某一天对它们进行分组,然后每个月进行冲洗和重复?
想想闰年的特点。
闰年,二月有 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
一个月有多少天,请参阅stackoverflow
如何在MySQL中创建新日期,请参阅w3school
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 年不是闰年。
我希望你能理解这一点。