我想选择按日期分组的项目总和,或者更准确地说是每半小时一次。
我找到了多个使用单独表格的解决方案,其中生成了所有可能的日期和时间组合,然后使用fill_times
关键字加入。
对于这种方法,我需要一些东西:
items
FUNCTION `roundToHalfHour`(`mDateTime` DATETIME) RETURNS datetime
BEGIN
RETURN CONCAT( DATE( mDateTime ), ' ', SEC_TO_TIME(
FLOOR(
( TIME_TO_SEC( mDateTime ) + 900 ) / 1800
) * 1800
));
END
舍入函数可能如下所示:
SELECT date_hour AS Time, COUNT(items.id) AS Items
FROM fill_times LEFT JOIN items ON roundToHalfHour(items.timestamp) = fill_times.date_hour
WHERE (date_hour BETWEEN (
SELECT MIN(roundToHalfHour(items.timestamp))
FROM items
) AND (
SELECT MAX(roundToHalfHour(items.timestamp))
FROM items )
)
GROUP BY date_hour
此调用的SQL看起来像这样:
2017.01.02 00:01
上述方法需要预先生成的可能日期表,每年我需要大约18,000行。 此外,这种方法对于长期使用来说是非常不可靠的,因为它意味着要么生成大量的行(超过500万行用于安全范围,如1900 - 2200),要么在需要时生成新行,这是很多额外的工作,每次添加数据时都要记住。
附加说明:我想保留项目时间戳的日期部分,以便2017.01.01 23:59
之后仍然newtype {:nativeType "uint"} u32 =
x: nat | 0 <= x < 2147483648
必须有其他方法来解决这个问题,因为任何一个选项似乎效率都很低。
但是我在SQL函数和例程方面没有足够的经验来了解他们可以解决问题的方法。
如果纯SQL中没有其他可用的解决方案,是否可以在PHP中修改获取的数组以填充缺少的时间戳?
感谢您提出的所有建议,并帮助我指明正确的方向!