将时间段分成日历月 - mysql

时间:2012-11-14 19:33:46

标签: mysql

我基本上面临与此主题中描述的问题相同的问题:http://www.experts-exchange.com/Database/Oracle/10.x/Q_24693813.html。不同之处在于我需要找到一个 MYSQL 的解决方案。

我正在处理电力使用表:

ID     Account   FromDate      ToDate       ElecUse   ElecDemand  ElecBillAmt
2903   100009    2010-10-14    2010-11-12   352400    668.1       12592.53
2904   100009    2010-11-12    2010-12-15   426400    666         14284.39
2905   100009    2010-12-15    2010-01-14   406800    708.4       13812.54
2906   100009    2010-01-14    2010-02-15   443200    697.9       14514.99

我想每月报告使用情况,从每月开始到每个月末结束。因此,我想有一个MYSQL查询,可以从上面生成下表:

Account   FromDate      ToDate        ElecUse    ElecDemand    ElecBillAmt
100009    2010-10-14    2010-10-31    206579     391.51        7381.74
100009    2010-11-01    2010-11-30    378402     639.24        13002.12
100009    2010-12-01    2010-12-31    410778     680.46        13859.46
100009    2011-01-01    2011-01-31    425290     701.14        14156.77
100009    2011-02-01    2011-02-15    207750     327           6803.85

我很感激帮助, 丹

1 个答案:

答案 0 :(得分:0)

将列转换为行通常是自联接或联合的工作。

在所有示例中,您的FromDate是ToDate之前的一个月。如何获取第一个月的天数,另一个获取第二个月的剩余天数?之后在两者之间分配ElecUse很容易。

根据您的实际数据,您可能需要更多查询(两个日期在同一个月等)。

select fromdate, last_day(fromdate) as todate,
  datediff(last_day(fromdate), fromdate) as days_in_month,
  datediff(todate, fromdate) as days_in_range,
  datediff(last_day(fromdate), fromdate)/datediff(todate, fromdate) as pct_in_month,
  elecuse * (datediff(last_day(fromdate), fromdate)/datediff(todate, fromdate)) as elecuse_in_month
...

我离开了中间栏,这样你就可以看到发生了什么:

+------------+------------+---------------+---------------+--------------+------------------+
| fromdate   | todate     | days_in_month | days_in_range | pct_in_month | elecuse_in_month |
+------------+------------+---------------+---------------+--------------+------------------+
| 2010-10-14 | 2010-10-31 |            17 |            29 |       0.5862 |      206579.3102 |
+------------+------------+---------------+---------------+--------------+------------------+

UNION那个在原始行的范围内执行第二个月的另一个查询,你应该全部设置。

注意@OllieJones关于ElecDemand的警告。