class Extract(expression, lookup_name=None, tzinfo=None, **extra)
[source]
Extracts a component of a date as a number.
Takes an expression
representing a DateField
or DateTimeField
and a lookup_name
, and returns the part of the date referenced by lookup_name
as an IntegerField
. Django usually uses the databases’ extract function, so you may use any lookup_name
that your database supports. A tzinfo
subclass, usually provided by pytz
, can be passed to extract a value in a specific timezone.
Given the datetime 2015-06-15 23:30:01.000321+00:00
, the built-in lookup_name
s return:
- “year”: 2015
- “month”: 6
- “day”: 15
- “week_day”: 2
- “hour”: 23
- “minute”: 30
- “second”: 1
If a different timezone like Australia/Melbourne
is active in Django, then the datetime is converted to the timezone before the value is extracted. The timezone offset for Melbourne in the example date above is +10:00. The values returned when this timezone is active will be the same as above except for:
- “day”: 16
- “week_day”: 3
- “hour”: 9
week_day
values
The week_day
lookup_type
is calculated differently from most databases and from Python’s standard functions. This function will return 1
for Sunday, 2
for Monday, through 7
for Saturday.
The equivalent calculation in Python is:
>>> from datetime import datetime >>> dt = datetime(2015, 6, 15) >>> (dt.isoweekday() % 7) + 1 2
Each lookup_name
above has a corresponding Extract
subclass (listed below) that should typically be used instead of the more verbose equivalent, e.g. use ExtractYear(...)
rather than Extract(..., lookup_name='year')
.
Usage example:
>>> from datetime import datetime >>> from django.db.models.functions import Extract >>> start = datetime(2015, 6, 15) >>> end = datetime(2015, 7, 2) >>> Experiment.objects.create( ... start_datetime=start, start_date=start.date(), ... end_datetime=end, end_date=end.date()) >>> # Add the experiment start year as a field in the QuerySet. >>> experiment = Experiment.objects.annotate( ... start_year=Extract('start_datetime', 'year')).get() >>> experiment.start_year 2015 >>> # How many experiments completed in the same year in which they started? >>> Experiment.objects.filter( ... start_datetime__year=Extract('end_datetime', 'year')).count() 1
Please login to continue.