Source code for postgres_stats.functions
from django.db.models import Aggregate, Func
import six
[docs]class DateTrunc(Func):
"""
Accepts a single timestamp field or expression and returns that timestamp
truncated to the specified *precision*. This is useful for investigating
time series.
The *precision* named parameter can take:
* microseconds
* milliseconds
* second
* minute
* hour
* day
* week
* month
* quarter
* year
* decade
* century
* millennium
Usage example::
checkin = Checkin.objects.
annotate(day=DateTrunc('logged_at', 'day'),
hour=DateTrunc('logged_at', 'hour')).
get(pk=1)
assert checkin.logged_at == datetime(2015, 11, 1, 10, 45, 0)
assert checkin.day == datetime(2015, 11, 1, 0, 0, 0)
assert checkin.hour == datetime(2015, 11, 1, 10, 0, 0)
"""
function = "DATE_TRUNC"
template = "%(function)s('%(precision)s', %(expressions)s)"
def __init__(self, expression, precision, **extra):
if six.PY2:
super(DateTrunc, self).__init__(expression, precision=precision, **extra)
else:
super().__init__(expression, precision=precision, **extra)
[docs]class Extract(Func):
"""
Accepts a single timestamp or interval field or expression and returns
the specified *subfield* of that expression. This is useful for grouping
data.
The *subfield* named parameter can take:
* century
* day
* decade
* dow (day of week)
* doy (day of year)
* epoch (seconds since 1970-01-01 00:00:00 UTC)
* hour
* isodow
* isodoy
* isoyear
* microseconds
* millennium
* milliseconds
* minute
* month
* quarter
* second
* timezone
* timezone_hour
* timezone_minute
* week
* year
See `the Postgres documentation`_ for details about the subfields.
Usage example::
checkin = Checkin.objects.
annotate(day=Extract('logged_at', 'day'),
minute=Extract('logged_at', 'minute'),
quarter=Extract('logged_at', 'quarter')).
get(pk=1)
assert checkin.logged_at == datetime(2015, 11, 1, 10, 45, 0)
assert checkin.day == 1
assert checkin.minute == 45
assert checkin.quarter == 4
.. _the Postgres documentation: http://www.postgresql.org/docs/current/static/functions-datetime.html#FUNCTIONS-DATETIME-EXTRACT
"""
function = 'EXTRACT'
name = 'extract'
template = "%(function)s(%(subfield)s FROM %(expressions)s)"
def __init__(self, expression, subfield, **extra):
if six.PY2:
super(Extract, self).__init__(expression, subfield=subfield, **extra)
else:
super().__init__(expression, subfield=subfield, **extra)