Range partitioning by date helps organize data into smaller parts based on date ranges. This makes searching and managing data faster and easier.
You have a large table with data collected over many years and want to speed up queries for specific time periods.
You want to archive old data separately but still keep it accessible.
You need to improve performance for reports that focus on recent months or years.
You want to manage data storage by splitting it into monthly or yearly parts.
You want to delete old data quickly by dropping partitions instead of running slow delete commands.
Syntax
PostgreSQL
CREATETABLE parent_table (
id SERIALPRIMARYKEY,
data TEXT,
created_date DATENOTNULL
) PARTITION BY RANGE (created_date);
CREATETABLE partition_name PARTITION OF parent_table
FOR VALUESFROM ('start_date') TO ('end_date');
The parent table holds the structure but no data directly.
Each partition stores rows for a specific date range.
Examples
This creates a parent table 'sales' partitioned by the 'sale_date' column.
PostgreSQL
CREATETABLE sales (
sale_id SERIALPRIMARYKEY,
amount NUMERIC,
sale_date DATENOTNULL
) PARTITION BY RANGE (sale_date);
This creates a partition for all sales in the year 2023.
PostgreSQL
CREATETABLE sales_2023 PARTITION OF sales
FOR VALUESFROM ('2023-01-01') TO ('2024-01-01');
This creates a partition for all sales in the year 2024.
PostgreSQL
CREATETABLE sales_2024 PARTITION OF sales
FOR VALUESFROM ('2024-01-01') TO ('2025-01-01');
Sample Program
This example creates a table 'orders' partitioned by year. It inserts two orders, one in 2023 and one in 2024. The SELECT query shows all orders sorted by date.
PostgreSQL
CREATETABLE orders (
order_id SERIALPRIMARYKEY,
customer_name TEXT,
order_date DATENOTNULL
) PARTITION BY RANGE (order_date);
CREATETABLE orders_2023 PARTITION OF orders
FOR VALUESFROM ('2023-01-01') TO ('2024-01-01');
CREATETABLE orders_2024 PARTITION OF orders
FOR VALUESFROM ('2024-01-01') TO ('2025-01-01');
INSERTINTO orders (customer_name, order_date) VALUES
('Alice', '2023-05-10'),
('Bob', '2024-03-15');
SELECT * FROM orders ORDERBY order_date;
OutputSuccess
Important Notes
Partitions must cover all possible date ranges without overlap.
Queries on the parent table automatically use the correct partitions.
Dropping a partition is faster than deleting many rows.
Summary
Range partitioning by date splits data into parts based on date ranges.
This improves query speed and data management.
Each partition holds data for a specific time period.
Practice
(1/5)
1. What is the main purpose of range partitioning by date in PostgreSQL?
easy
A. To create random partitions without any order
B. To split data into parts based on date ranges for better management
C. To encrypt date columns for security
D. To combine all data into a single large table
Solution
Step 1: Understand range partitioning concept
Range partitioning divides data into segments based on continuous ranges, such as dates.
Step 2: Identify the purpose of date-based partitioning
Using date ranges helps organize data by time periods, improving query speed and management.
Final Answer:
To split data into parts based on date ranges for better management -> Option B
Quick Check:
Range partitioning by date = split data by date ranges [OK]
Hint: Range partitioning splits data by continuous date intervals [OK]
Common Mistakes:
Thinking partitioning combines data instead of splitting
Confusing partitioning with encryption
Assuming partitions are random, not range-based
2. Which of the following is the correct syntax to create a range partitioned table by a date column order_date in PostgreSQL?
easy
A. CREATE TABLE orders (id INT, order_date DATE) PARTITION BY RANGE (order_date);
B. CREATE TABLE orders PARTITION BY RANGE (order_date) (id INT, order_date DATE);
C. CREATE TABLE orders (id INT, order_date DATE) PARTITION BY LIST (order_date);
D. CREATE TABLE orders (id INT, order_date DATE) PARTITION BY HASH (order_date);
In PostgreSQL, PARTITION BY RANGE (column) comes after table columns definition.
Step 2: Identify correct partition type for date ranges
Range partitioning is used for continuous ranges like dates, so PARTITION BY RANGE is correct.
Final Answer:
CREATE TABLE orders (id INT, order_date DATE) PARTITION BY RANGE (order_date); -> Option A
Quick Check:
Syntax: columns then PARTITION BY RANGE [OK]
Hint: Define columns first, then PARTITION BY RANGE (date_column) [OK]
Common Mistakes:
Placing PARTITION BY before columns
Using LIST or HASH instead of RANGE for dates
Incorrect syntax order causing errors
3. Given the following partitioned table and partitions:
CREATE TABLE sales (id INT, sale_date DATE) PARTITION BY RANGE (sale_date);
CREATE TABLE sales_2023 PARTITION OF sales FOR VALUES FROM ('2023-01-01') TO ('2024-01-01');
CREATE TABLE sales_2024 PARTITION OF sales FOR VALUES FROM ('2024-01-01') TO ('2025-01-01');
What will be the result of this query?
SELECT tableoid::regclass, * FROM sales WHERE sale_date = '2023-06-15';
medium
A. Returns rows from sales_2024 partition with sale_date '2023-06-15'
B. Returns no rows because '2023-06-15' is not in any partition
C. Returns rows from both partitions
D. Returns rows from sales_2023 partition with sale_date '2023-06-15'
Solution
Step 1: Identify which partition contains '2023-06-15'
The date '2023-06-15' falls between '2023-01-01' and '2024-01-01', so it belongs to sales_2023 partition.
Step 2: Understand query behavior on partitioned tables
Query on partitioned table routes to matching partition(s) based on WHERE clause; here, only sales_2023 matches.
Final Answer:
Returns rows from sales_2023 partition with sale_date '2023-06-15' -> Option D
Quick Check:
Date in sales_2023 range = rows from sales_2023 [OK]
Hint: Check date range to find correct partition for query [OK]
Common Mistakes:
Choosing wrong partition based on date
Assuming query scans all partitions
Ignoring partition boundaries
4. You try to create a partition for a range partitioned table by date with this command:
CREATE TABLE sales_2025 PARTITION OF sales FOR VALUES FROM ('2025-01-01') TO ('2024-12-31');
What is the problem with this statement?
medium
A. The TO date is earlier than the FROM date, causing a range error
B. Partition names cannot contain numbers
C. You must specify LIST partitioning, not RANGE
D. The sales table must be dropped before adding partitions
Solution
Step 1: Check the FROM and TO values in partition definition
The TO value '2024-12-31' is before the FROM value '2025-01-01', which is invalid for range partitions.
Step 2: Understand partition range rules
Range partitions require FROM value to be less than TO value to define a valid range.
Final Answer:
The TO date is earlier than the FROM date, causing a range error -> Option A
Quick Check:
FROM must be less than TO in range partitions [OK]
Hint: FROM date must be before TO date in range partitions [OK]
Common Mistakes:
Swapping FROM and TO dates
Thinking partition names cannot have numbers
Confusing range with list partitioning
5. You have a large sales table partitioned by month using range partitioning on sale_date. You want to add a new partition for March 2024. Which of the following commands correctly adds this partition?
hard
A. CREATE TABLE sales_2024_03 PARTITION OF sales FOR VALUES FROM ('2024-03-01') TO ('2024-03-31');
B. CREATE TABLE sales_2024_03 PARTITION OF sales FOR VALUES FROM ('2024-02-28') TO ('2024-03-31');
C. CREATE TABLE sales_2024_03 PARTITION OF sales FOR VALUES FROM ('2024-03-01') TO ('2024-04-01');
D. CREATE TABLE sales_2024_03 PARTITION OF sales FOR VALUES FROM ('2024-03-01') TO ('2024-03-30');
Solution
Step 1: Understand range partition boundaries for months
Range partitions use inclusive FROM and exclusive TO, so March 2024 is from '2024-03-01' up to but not including '2024-04-01'.
Step 2: Check each option's date range correctness
CREATE TABLE sales_2024_03 PARTITION OF sales FOR VALUES FROM ('2024-03-01') TO ('2024-04-01'); correctly uses FROM '2024-03-01' TO '2024-04-01'. Options B, C, and D have incorrect boundaries that either overlap or exclude days.
Final Answer:
CREATE TABLE sales_2024_03 PARTITION OF sales FOR VALUES FROM ('2024-03-01') TO ('2024-04-01'); -> Option C
Quick Check:
Range partitions: FROM inclusive, TO exclusive [OK]
Hint: Use TO date as first day of next month for monthly partitions [OK]
Common Mistakes:
Using TO date as last day of month (should be exclusive)
Overlapping partition ranges
Using incorrect FROM dates
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.