SQL选择范围内的所有日期,即使没有专用表也不存在

时间:2017-09-28 21:54:24

标签: php mysql sql date

我想选择按日期分组的项目总和,或者更准确地说是每半小时一次。

我找到了多个使用单独表格的解决方案,其中生成了所有可能的日期和时间组合,然后使用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
  • 用于将时间戳舍入到适当的半小时的MySQL函数

舍入函数可能如下所示:

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中修改获取的数组以填充缺少的时间戳?

感谢您提出的所有建议,并帮助我指明正确的方向!

0 个答案:

没有答案