📖 Scenario: You work in a company that tracks sales data with timestamps. You want to group sales by month to see monthly totals.
🎯 Goal: Build a simple PostgreSQL query that uses DATE_TRUNC to round timestamps to the start of the month.
📋 What You'll Learn
Create a table called sales with columns id (integer), sale_date (timestamp), and amount (numeric).
Insert three sales records with exact timestamps and amounts.
Create a variable or CTE to hold the truncation precision 'month'.
Write a query that selects the truncated sale_date by month and sums amount grouped by that truncated date.
💡 Why This Matters
🌍 Real World
Grouping sales or events by month helps businesses analyze monthly trends and make decisions.
💼 Career
Knowing how to use DATE_TRUNC is useful for data analysts and database developers working with time-series data.
Progress0 / 4 steps
1
Create the sales table and insert data
Create a table called sales with columns id as integer, sale_date as timestamp, and amount as numeric. Then insert these three rows exactly: (1, '2024-04-15 10:30:00', 100.50), (2, '2024-04-20 15:45:00', 200.75), and (3, '2024-05-05 09:00:00', 150.00).
PostgreSQL
Hint
Use CREATE TABLE to define the table and INSERT INTO to add rows.
2
Define the truncation precision
Create a variable or CTE called precision and set it to the string 'month' to specify the date truncation level.
PostgreSQL
Hint
Use a CTE with WITH and SELECT 'month'::text AS level.
3
Write the query using DATE_TRUNC
Write a query that selects DATE_TRUNC('month', sale_date) as month_start and sums amount as total_amount from sales. Group the results by month_start.
PostgreSQL
Hint
Use DATE_TRUNC('month', sale_date) in the SELECT and group by that alias.
4
Complete the query using the precision variable
Modify the query to use the precision CTE's level value inside DATE_TRUNC instead of the fixed string 'month'. Use a join or cross join with precision to access level.
PostgreSQL
Hint
Use a cross join with precision and replace the fixed string with precision.level inside DATE_TRUNC.
Practice
(1/5)
1. What does the PostgreSQL function DATE_TRUNC('month', timestamp) do?
easy
A. It returns the exact timestamp without any change.
B. It rounds the timestamp down to the first day of the month at 00:00:00.
C. It rounds the timestamp up to the last day of the month at 23:59:59.
D. It converts the timestamp to a string showing only the month.
Solution
Step 1: Understand DATE_TRUNC behavior
DATE_TRUNC cuts off smaller parts of a timestamp to the specified precision, rounding down.
Step 2: Apply 'month' precision
Using 'month' sets the date to the first day of that month at midnight (00:00:00).
Final Answer:
It rounds the timestamp down to the first day of the month at 00:00:00. -> Option B
Quick Check:
DATE_TRUNC('month', timestamp) = first day of month [OK]
Hint: DATE_TRUNC cuts smaller parts, sets time to zero [OK]
Common Mistakes:
Thinking it rounds up instead of down
Assuming it returns a string
Believing it keeps the original timestamp unchanged
2. Which of the following is the correct syntax to truncate a timestamp to the nearest hour in PostgreSQL?
easy
A. DATE_TRUNC('hour', 13:45:30)
B. DATE_TRUNC(hour, '2024-06-15 13:45:30')
C. DATE_TRUNC('hour', 2024-06-15 13:45:30)
D. DATE_TRUNC('hour', '2024-06-15 13:45:30')
Solution
Step 1: Check function syntax
DATE_TRUNC requires the first argument as a string specifying the precision, e.g., 'hour'.
Step 2: Validate timestamp format
The second argument must be a timestamp or string representing a timestamp enclosed in quotes.
Final Answer:
DATE_TRUNC('hour', '2024-06-15 13:45:30') -> Option D
Quick Check:
Correct syntax uses quotes around precision and timestamp [OK]
Hint: Always quote the precision string in DATE_TRUNC [OK]
Common Mistakes:
Not quoting the precision string
Passing timestamp without quotes
Using incomplete timestamp formats
3. Given the query: SELECT DATE_TRUNC('day', TIMESTAMP '2024-06-15 18:23:45'); What is the output?
medium
A. 2024-06-15 18:23:45
B. 2024-06-01 00:00:00
C. 2024-06-15 00:00:00
D. 2024-06-15 23:59:59
Solution
Step 1: Understand 'day' precision in DATE_TRUNC
Truncating to 'day' sets the time to midnight (00:00:00) of the same date.
Step 2: Apply to given timestamp
For '2024-06-15 18:23:45', truncation results in '2024-06-15 00:00:00'.
Final Answer:
2024-06-15 00:00:00 -> Option C
Quick Check:
DATE_TRUNC('day', timestamp) = date at midnight [OK]
Hint: Truncating to day resets time to 00:00:00 [OK]
Common Mistakes:
Expecting original time to remain
Confusing day truncation with month truncation
Thinking it rounds to nearest day
4. Identify the error in this query: SELECT DATE_TRUNC('min', '2024-06-15 12:34:56');
medium
A. The precision 'min' is invalid in DATE_TRUNC.
B. The timestamp string is not cast to TIMESTAMP type.
C. The function DATE_TRUNC requires three arguments.
D. The timestamp string should be in single quotes.
Solution
Step 1: Check precision argument
DATE_TRUNC requires the first argument to be a specific precision string (e.g., 'minute', 'hour'). 'min' is invalid.
Step 2: Identify the error
This causes an error like 'invalid value for parameter "field": "min"'.
Final Answer:
The precision 'min' is invalid in DATE_TRUNC. -> Option A
Quick Check:
Valid precisions include 'minute' [OK]
Hint: Use exact precision strings: 'minute' not 'min' [OK]
Common Mistakes:
Assuming string is auto-converted
Using invalid precision values
Adding extra arguments to DATE_TRUNC
5. You want to group sales data by week starting on Monday using DATE_TRUNC. Which query correctly truncates the timestamp to the start of the week?
hard
A. SELECT DATE_TRUNC('week', sale_date + INTERVAL '1 day') - INTERVAL '1 day' FROM sales;
B. SELECT DATE_TRUNC('dow', sale_date) FROM sales;
C. SELECT DATE_TRUNC('month', sale_date) FROM sales;
D. SELECT DATE_TRUNC('week', sale_date) FROM sales;
Solution
Step 1: Understand DATE_TRUNC('week') behavior
In PostgreSQL, DATE_TRUNC('week', timestamp) returns the start of the week on Sunday.
Step 2: Adjust to Monday start
Adding 1 day before truncation shifts the week start to Monday, then subtracting 1 day corrects the date.
Final Answer:
SELECT DATE_TRUNC('week', sale_date + INTERVAL '1 day') - INTERVAL '1 day' FROM sales; -> Option A
Quick Check:
Shift date to align week start Monday [OK]
Hint: Shift date by 1 day to start week on Monday [OK]
Common Mistakes:
Assuming 'week' starts on Monday by default
Using invalid precision 'dow'
Truncating to month instead of week
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.