所以我有这种数据
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中生成两次之间的所有分钟,所以我可以使用我的数据加入此列表
答案 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/>