2012-11-14 76 views
0

我基本上面臨着與此主題中所述相同的問題:http://www.experts-exchange.com/Database/Oracle/10.x/Q_24693813.html。不同的是,我需要找到一個與MYSQL解決方案。將時間段分成日曆月 - 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

Expert S-ex Change eh? –

+1

看來您正在尋找某種成本的插值。線性插值使用數據似乎可行。但是,ElecDemand是一個瞬時峯值負載測量。如何將其分配給特定的日曆月並不明顯。嘗試插入它就好像它是用法一樣沒有任何意義。你有沒有嘗試過任何SQL查詢? –

回答

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的警告。