在plsql中生成两次之间的所有分钟

时间:2016-11-30 14:07:37

标签: date plsql

所以我有这种数据

DATA COUNT 29/11/2016 22:11:00 120 29/11/2016 22:12:00 132 29/11/2016 22:13:00 551 29/11/2016 22:14:00 1 29/11/2016 22:33:00 1

我需要获得一个包含所有分钟的列表,如果在日期不符合我的连接条件,它将显示0。

简而言之:

我需要在plsql中生成两次之间的所有分钟,所以我可以使用我的数据加入此列表

2 个答案:

答案 0 :(得分:1)

这应该可以解决问题,并考虑跨越时间的时间(例如23:50 - 00:10):

WITH boundary_dates AS (SELECT to_date('29/11/2016 23:50:45', 'dd/mm/yyyy hh24:mi:ss') start_date,
                               to_date('30/11/2016 00:10:00', 'dd/mm/yyyy hh24:mi:ss') end_date
                        FROM   dual)
SELECT trunc(start_date, 'mi') + (LEVEL -1)/1440 dt
FROM   boundary_dates
CONNECT BY LEVEL <= (end_date - trunc(start_date, 'mi'))*1440 + 1;

DT
----------------
29/11/2016 23:50
29/11/2016 23:51
29/11/2016 23:52
29/11/2016 23:53
29/11/2016 23:54
29/11/2016 23:55
29/11/2016 23:56
29/11/2016 23:57
29/11/2016 23:58
29/11/2016 23:59
30/11/2016 00:00
30/11/2016 00:01
30/11/2016 00:02
30/11/2016 00:03
30/11/2016 00:04
30/11/2016 00:05
30/11/2016 00:06
30/11/2016 00:07
30/11/2016 00:08
30/11/2016 00:09
30/11/2016 00:10

然后你可以简单地将你的另一个表/视图/查询连接到这个并使用nvl / coalesce为“缺失”值输出0。

N.B。我的示例使用子查询来传递开始/结束日期。您可能会使用变量(可能作为参数传入),因此您不需要boundary_dates子查询。

答案 1 :(得分:0)

确定。

这比我想象的要少:

SELECT
  (to_date('29-11-2016 20:59:00','DD-MM-YYYY HH24:MI:SS') + level/1440) AS date
FROM
  dual
CONNECT BY LEVEL <= (round((to_date('23:59:59','HH24:MI:SS') - to_date('21:00:00','HH24:MI:SS'))*1440,0));

试着解释:

(round((to_date('23:59:59','HH24:MI:SS') - to_date('21:00:00','HH24:MI:SS'))*1440,0)我计算两次之间的分钟差异(现在我得180分钟)

to_date('29-11-2016 20:59:00','DD-MM-YYYY HH24:MI:SS') + level/1440 date 29-11-2016 20:59:00我计算到level/1440所有分钟前的<input/>