Opened 11 years ago
Closed 10 years ago
#24699 closed New feature (fixed)
Add Avg('DurationField') support on Oracle
| Reported by: | Tim Graham | Owned by: | Josh Smeaton |
|---|---|---|---|
| Component: | Database layer (models, ORM) | Version: | dev |
| Severity: | Normal | Keywords: | oracle |
| Cc: | Triage Stage: | Ready for checkin | |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
From Josh in a PR:
Oracle doesn't allow Avg or Sum on interval data types. Seems like the commonly accepted way to do so is with EXTRACT(day from 24*60*60*interval). See http://stackoverflow.com/a/5063553/10583. That only gets you to second resolution though, completely ignoring microseconds. Not really ideal.
http://www.dba-oracle.com/t_timestamp_math_elapsed_times.htm is another option which involves extracting each piece of the date component and multiplying by a constant. That'll give microsecond precision (decimal second component at least).
with the_interval as ( select INTERVAL '4 5:12:10.999999' DAY TO SECOND(6) itv from dual ) select itv, -- convert back to interval after applying avg function NUMTODSINTERVAL(avg(extract(day from itv)*86400 + extract(hour from itv)*3600 + extract(minute from itv)*60 + extract(second from itv)), 'SECOND') seconds_with_precision, extract(day from 24*60*60*itv) seconds_without_precision from the_interval;
To support this in AVG, we'd need to create an as_oracle() method, test if the output_field is an interval, and then wrap output_field with multiple extracts. The functions.Coalesce does something similar with TextFields, so it's not unprecedented.
Change History (5)
comment:1 by , 10 years ago
comment:2 by , 10 years ago
| Has patch: | set |
|---|---|
| Version: | 1.8 → master |
comment:3 by , 10 years ago
| Patch needs improvement: | set |
|---|
comment:4 by , 10 years ago
| Patch needs improvement: | unset |
|---|---|
| Triage Stage: | Accepted → Ready for checkin |
I'm working on this at the moment. I think there are similar issues with the SUM(interval) aggregate, so I'll do that if required too.