I had a recent DBA.SE question that involved dates that were used as the x-axis in a graph: Interpolate dates along a line.
It was centred around a road_condition
table:
COND_ID ROAD_ID COND_DATE CONDITION
------- ------- -------- ---------
1 100 84-11-01 18
2 100 09-01-01 6
3 100 12-06-19 4
4 100 15-04-29 4
5 200 92-04-29 20
6 200 17-04-05 3
Note: I consider cond_date
to be the X-axis, and condition
to be the Y-axis.
In my an attempt to answer my own question, I tried to do things like use cond_date
as X1
in a calculation:
y1 - ((y2-y1)/(x2-x1)) * x1 as y_intercept
However, obviously I can't just use a date in a calculation that involves multiplication or division; dates are not traditional numbers.
As a work around, I stripped the date of its month and day: extract(year from cond_date)
and performed the calculations from there on the resulting integer (the year). However, by doing this, I of course lose valuable precision in the number. This compromises the output of the calculation.
How can I multiply and divide dates, without losing precision?
Best Answer
I think you can convert each date value to a number of time units -- days, hours, seconds etc. according to your precision requirement -- since some base date, similar to the Unix epoch. This will allow you to manipulate them as regular numbers.
For example, the expression
cond_date - TO_DATE('1970-01-01', 'YYYY-MM-DD')
will give you the number of days since 1 Jan. 1970.