Date / time functions

Django ORM PostgreSQL May 22, 2026 python

Date handling over one book's published timestamp.

python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# ======================================================================
# Date handling over one book's `published` timestamp. `Extract*` pulls a
# component (year, month, day, weekday, quarter); `Trunc*` rounds a timestamp
# down to a unit (`date_trunc`); `Now()` is the statement timestamp.
# ======================================================================

# ----------------------------------------------------------------------
# date parts & truncation over the 2026 book
# ----------------------------------------------------------------------

# Django:
Book.objects.filter(title="Postgres for Authors").annotate(
    year=ExtractYear("published"), month=ExtractMonth("published"),
    day=ExtractDay("published"), weekday=ExtractWeekDay("published"),
    quarter=ExtractQuarter("published"), week=ExtractWeek("published"),
    isoyear=ExtractIsoYear("published"), isodow=ExtractIsoWeekDay("published"),
    hour=ExtractHour("published"), minute=ExtractMinute("published"),
    second=ExtractSecond("published"),
    tmonth=TruncMonth("published"), tyear=TruncYear("published"),
    tday=TruncDay("published"), tweek=TruncWeek("published"),
    tquarter=TruncQuarter("published"), thour=TruncHour("published"),
    tminute=TruncMinute("published"), tsecond=TruncSecond("published"),
    ttime=TruncTime("published"), now=Now(),
)

# SQL:
#   SELECT EXTRACT(YEAR
#   FROM "examples_book"."published" AT TIME ZONE 'UTC') AS "year", EXTRACT(MONTH
#   FROM "examples_book"."published" AT TIME ZONE 'UTC') AS "month", EXTRACT(DAY
#   FROM "examples_book"."published" AT TIME ZONE 'UTC') AS "day", EXTRACT(DOW
#   FROM "examples_book"."published" AT TIME ZONE 'UTC') + 1 AS "weekday", EXTRACT(QUARTER
#   FROM "examples_book"."published" AT TIME ZONE 'UTC') AS "quarter", EXTRACT(WEEK
#   FROM "examples_book"."published" AT TIME ZONE 'UTC') AS "week", EXTRACT(ISOYEAR
#   FROM "examples_book"."published" AT TIME ZONE 'UTC') AS "isoyear", EXTRACT(ISODOW
#   FROM "examples_book"."published" AT TIME ZONE 'UTC') AS "isodow", EXTRACT(HOUR
#   FROM "examples_book"."published" AT TIME ZONE 'UTC') AS "hour", EXTRACT(MINUTE
#   FROM "examples_book"."published" AT TIME ZONE 'UTC') AS "minute", EXTRACT(SECOND
#   FROM DATE_TRUNC('second', "examples_book"."published" AT TIME ZONE 'UTC')) AS "second", DATE_TRUNC('month', "examples_book"."published" AT TIME ZONE 'UTC') AS "tmonth", DATE_TRUNC('year', "examples_book"."published" AT TIME ZONE 'UTC') AS "tyear", DATE_TRUNC('day', "examples_book"."published" AT TIME ZONE 'UTC') AS "tday", DATE_TRUNC('week', "examples_book"."published" AT TIME ZONE 'UTC') AS "tweek", DATE_TRUNC('quarter', "examples_book"."published" AT TIME ZONE 'UTC') AS "tquarter", DATE_TRUNC('hour', "examples_book"."published" AT TIME ZONE 'UTC') AS "thour", DATE_TRUNC('minute', "examples_book"."published" AT TIME ZONE 'UTC') AS "tminute", DATE_TRUNC('second', "examples_book"."published" AT TIME ZONE 'UTC') AS "tsecond", ("examples_book"."published" AT TIME ZONE 'UTC')::time AS "ttime", STATEMENT_TIMESTAMP() AS "now"
#   FROM "examples_book"
#   WHERE "examples_book"."title" = 'Postgres for Authors'
#   ORDER BY "examples_book"."id" ASC
#   LIMIT 1

# Result:
#   ExtractYear      -> 2026
#   ExtractMonth     -> 1
#   ExtractDay       -> 15
#   ExtractWeekDay   -> 5  (1=Sun .. 7=Sat)
#   ExtractISOWeekDay-> 4  (1=Mon .. 7=Sun)
#   ExtractQuarter   -> 1
#   ExtractWeek      -> 3
#   ExtractISOYear   -> 2026
#   ExtractHour      -> 0
#   ExtractMinute    -> 0
#   ExtractSecond    -> 0
#   TruncMonth       -> 2026-01-01
#   TruncYear        -> 2026-01-01
#   TruncDay         -> 2026-01-15
#   TruncWeek        -> 2026-01-12
#   TruncQuarter     -> 2026-01-01
#   TruncHour        -> 2026-01-15 00:00
#   TruncMinute      -> 2026-01-15 00:00
#   TruncSecond      -> 2026-01-15 00:00:00
#   TruncTime        -> 00:00:00
#   Now()            -> 2026-05-22 19:01 UTC