The cause of batteries draining is physics and chemistry.
CPU use drains the battery, so all you have to do is figure why the CPU won't sleep and you will have weeks of standby life.
I had an iPhone 4 last in standby for over 5 weeks (on a bet) and the battery in that phone is well over 18 months old at this point.
Here is the low battery log showing how long one charge of the battery lasted when you isolate the device and don't run apps on the CPU.
Incident Identifier: 32B64787-774B-44E2-9362-55E0DFA34419
CrashReporter Key: f51c8deeb5a5044afeb4c9a6b09528b7e38b0fa1
Date: 2013-03-13 00:52:15 -0500
OS Version: iPhone OS 6.0.1 (10A523)
MobileMail: com.apple.persistentconnection[MobileMail,95,MailAutoFetch-connectionmanager(0x1e57e290)] NoIdleSleepAssertion == 255, held for 00:00:00
dataaccessd: com.apple.persistentconnection[dataaccessd,79,6E6ACD65-0112-4B16-8439-90B5335A8511-connectionman...] NoIdleSleepAssertion == 255, held for 00:00:00
dataaccessd: com.apple.persistentconnection[dataaccessd,79,3721C174-0131-433C-A9C4-72A7AD586BDF-connectionman...] NoIdleSleepAssertion == 255, held for 00:00:00
dataaccessd: com.apple.persistentconnection[dataaccessd,79,6E6ACD65-0112-4B16-8439-90B5335A8511-connectionman...] NoIdleSleepAssertion == 255, held for 00:00:00
dataaccessd: com.apple.persistentconnection[dataaccessd,79,3721C174-0131-433C-A9C4-72A7AD586BDF-connectionman...] NoIdleSleepAssertion == 255, held for 00:00:00
dataaccessd: com.apple.persistentconnection[dataaccessd,79,3721C174-0131-433C-A9C4-72A7AD586BDF-connectionman...] NoIdleSleepAssertion == 255, held for 00:00:00
dataaccessd: com.apple.persistentconnection[dataaccessd,79,88C57836-D9E4-4B38-B195-A357D3D1C2DB-connectionman...] NoIdleSleepAssertion == 255, held for 00:00:00
dataaccessd: com.apple.persistentconnection[dataaccessd,79,88C57836-D9E4-4B38-B195-A357D3D1C2DB-connectionman...] NoIdleSleepAssertion == 255, held for 00:00:00
Hardware Model: N90AP
Awake Time: 13:25:04 (48304)
Standby Time: 842:08:47 (3031727)
Partial Charge: 0
Capacity: 1
Voltage: 3649 mV