Scan targets for PostgreSQL's interval type.
The Interval
type supports the full range of PostgreSQL intervals. Any
database interval should successfully Scan()
into a pqinterval.Interval
.
Example:
var ival pqinterval.Interval
err := conn.QueryRow("SELECT '4 days'::INTERVAL").Scan(&ival)
if err != nil {
log.Fatal(err)
}
fmt.Println(ival.Hours())
The Duration
type is an alias of time.Duration
, but which supports
scanning from PostgreSQL intervals (potentially failing with ErrTooBig
).
Example:
var since time.Duration
d := (*pqinterval.Duration)(&since)
err = conn.QueryRow("SELECT '2 days'::INTERVAL").Scan(d)
if err != nil {
log.Fatal(err)
}
fmt.Println(since)
One caveat to be aware of: while PostgreSQL intervals are capable of modeling
a number of "months", the Interval
and Duration
types here are not. Any
time they scan an "x months"
interval they will assume 30 days in a month.
PostgreSQL avoids this ambiguity however when subtracting distant timestamps,
by providing a large number of days rather than breaking them down into months.