【发布时间】:2014-09-29 08:41:07
【问题描述】:
我的情况:
我有以下视图可以从中检索数据:
|ID | START_DATE | END_DATE |
|80 | 09-JAN-2013 15:01:52 | 20-SEP-2014 15:01:52 |
|82 | 09-SEP-2014 15:01:52 | 25-SEP-2014 15:01:52 |
我想要的是这样的:
|TOTAL_TIME_IN_HOURS| MONTH| YEAR |
| 200 | 01 | 2013 |
| 250 | 02 | 2013 |
| etc..... | etc. | etc..|
| 150 | 09 | 2014 |
一些附加信息: 我只能使用 select 语句,但我可以事先创建视图。 这是一个 Oracle 数据库,所以我无法使用 DATEDIFF 等 MYSQL 函数。
我做了以下事情:
SELECT
ID,
SUM(END_TIME - START_TIME) * 24 AS TOTAL_TIME_IN_HOURS,
FROM TABLE_X
WHERE TO_CHAR(START_TIME, 'MM') IN (1,2,3,4,5,6,7,8,9,10,11,12) AND TO_CHAR(START_TIME, 'YYYY') BETWEEN 1965 AND 2050 AND
TO_CHAR(END_TIME, 'MM') IN (1,2,3,4,5,6,7,8,9,10,11,12) AND TO_CHAR(END_TIME, 'YYYY') BETWEEN 1965 AND 2050
GROUP BY PROC_ID, TO_CHAR(START_TIME, 'YYYY'), TO_CHAR(START_TIME, 'MM') ORDER BY ID;
这将返回以下内容:
|ID| TOTAL_TIME_IN_HOURS |
|80| 5000 |
|82| 300 |
(我使用了虚构的结果,因为问题与事实结果无关)
这个逻辑没问题,因为我只需要开始日期和结束日期之间的总小时数。但是我需要的是开始日期和结束日期之间每月的总小时数。
我想在我的视图中添加其他列,例如 start_month、end_month、start_year 和 end_year。但是我遇到了这些选项的新问题,比如闰年......
我的问题是:有没有可能达到我想要的结果?如果是这样,我应该使用什么样的逻辑来达到这个结果? (最好是动态查询,这样就不用输入几百行代码了)
【问题讨论】:
-
使用日历表 LEFT JOIN 和 GROUP BY 每个月,年。这是您如何生成一个 stackoverflow.com/questions/8374959/…
-
可能是错字,但您视图中的行的开始日期在结束日期之后。
-
@SylvainLeroux 是的,确实是一个错字:)