Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在SQL中以分钟为单位动态生成时间间隔之间的时间序列_Mysql_Sql_Time_Query Optimization_Recursive Query - Fatal编程技术网

Mysql 在SQL中以分钟为单位动态生成时间间隔之间的时间序列

Mysql 在SQL中以分钟为单位动态生成时间间隔之间的时间序列,mysql,sql,time,query-optimization,recursive-query,Mysql,Sql,Time,Query Optimization,Recursive Query,问题就在这篇文章的结尾 我找到了这个链接来生成日期 并将其修改为在间隔内生成时间: SET @start_time = "08:02"; SET @stop_time = "17:02"; 问题 这能用更有效的方式写吗?我想用步骤指定一个间隔,这样可以快速地将其更新为每X分钟间隔。我不想将结果存储在DB中,我只想动态生成它。因为我会把它和其他表连接起来 我在mysql查询中经常使用这一点,为易于在Excel中绘制的度量值创建时间序列。为此,我非常喜欢递

问题就在这篇文章的结尾

我找到了这个链接来生成日期 并将其修改为在间隔内生成时间:

SET @start_time = "08:02";
SET @stop_time  = "17:02";
问题 这能用更有效的方式写吗?我想用步骤指定一个间隔,这样可以快速地将其更新为每X分钟间隔。我不想将结果存储在DB中,我只想动态生成它。因为我会把它和其他表连接起来


我在mysql查询中经常使用这一点,为易于在Excel中绘制的度量值创建时间序列。

为此,我非常喜欢递归CTE:

with recursive times as (
      select time('10:00:00') as time
      union all
      select time + interval 17 minute
      from times
      where time < time('17:00:00')
     )
select *
from times;

是一个dbfiddle。

它在OP的MySQL中确实可用吗?谢谢,这比我的解决方案简单得多。@banankontakt。首先是关于递归CTE的文档:。我个人认为有一个合理的理由将其存储在DB中,作为一个有1440行的表,一个时间列,也可能有一个小时列和分钟列,然后您可以从MODminute,5=0或MODMINUTEtime,5如果没有分离的分钟列,则每5分钟获取一次eg,时间以0/5结束。数据库非常擅长查询表;我只有一个只读帐户,而且我的时间序列通常很短,通常不到一个小时。在这个例子中,我把它延长了,所以解决方案应该更通用。我认为,你必须走一段合理的距离才能找到一位DBA,他主张每天动态地Y次生成X行,而不是在表中有少量行并选择它们。。只读限制比低行数更重要,因为添加大量临时表会污染数据库。这就是为什么他们开始使用只读帐户的原因,因为大多数用户都不善于在他们自己之后进行清理;询问接下来遇到的10位DBA他们对日历和数字表的看法。它们可能比你想象的更广泛,而且意义重大,尤其是日历表,因为它们可以告诉你一些公式化的日期序列无法告诉你的事情,比如公共假日
Time
10:02
10:03
10:04
10:05
10:06
...
16:59
17:00
17:01
with recursive times as (
      select time('10:00:00') as time
      union all
      select time + interval 17 minute
      from times
      where time < time('17:00:00')
     )
select *
from times;