Working with Time Zones using AT TIME ZONE in PostgreSQL
📖 Scenario: You are managing an international event scheduling database. Events are stored with timestamps in UTC, but users want to see event times in their local time zones.
🎯 Goal: Build a simple PostgreSQL query that converts UTC timestamps to a specified local time zone using the AT TIME ZONE clause.
📋 What You'll Learn
Create a table called events with columns event_id (integer) and event_time_utc (timestamp without time zone).
Insert three events with exact UTC timestamps: '2024-06-01 12:00:00', '2024-06-01 18:30:00', and '2024-06-02 09:15:00'.
Create a variable or CTE named target_zone with the value 'America/New_York'.
Write a SELECT query that converts event_time_utc to the target_zone time zone using AT TIME ZONE and returns event_id and the converted time as event_time_local.
💡 Why This Matters
🌍 Real World
Event scheduling systems often store times in UTC but need to display them in users' local time zones for clarity.
💼 Career
Understanding time zone conversions is essential for database developers and analysts working with global data.
Progress0 / 4 steps
1
Create the events table and insert UTC timestamps
Create a table called events with columns event_id as integer and event_time_utc as timestamp without time zone. Insert three rows with event_id values 1, 2, and 3 and event_time_utc values '2024-06-01 12:00:00', '2024-06-01 18:30:00', and '2024-06-02 09:15:00' respectively.
PostgreSQL
Hint
Use CREATE TABLE to define the table and INSERT INTO to add the rows with exact timestamps.
2
Define the target time zone variable
Create a Common Table Expression (CTE) named target_zone that contains a single column zone with the value 'America/New_York'.
PostgreSQL
Hint
Use a CTE with WITH target_zone AS (SELECT 'America/New_York'::text AS zone).
3
Write the query to convert UTC to local time
Using the target_zone CTE and the events table, write a SELECT query that returns event_id and event_time_utc AT TIME ZONE 'UTC' AT TIME ZONE zone as event_time_local. Join events with target_zone without any join condition.
PostgreSQL
Hint
Use AT TIME ZONE 'UTC' AT TIME ZONE t.zone to convert UTC timestamp to local time.
4
Complete the query with ORDER BY
Add an ORDER BY event_time_local clause at the end of the SELECT query to sort events by their local time.
PostgreSQL
Hint
Use ORDER BY event_time_local to sort the results by local event time.
Practice
(1/5)
1. What does the AT TIME ZONE clause do in PostgreSQL?
easy
A. It converts a timestamp from one time zone to another.
B. It changes the system time zone permanently.
C. It formats the timestamp as a string.
D. It deletes time zone information from a timestamp.
Solution
Step 1: Understand the purpose of AT TIME ZONE
This clause is used to convert timestamps between different time zones.
Step 2: Compare options
Only It converts a timestamp from one time zone to another. correctly describes this conversion. Other options describe unrelated actions.
Final Answer:
It converts a timestamp from one time zone to another. -> Option A
Quick Check:
AT TIME ZONE converts time zones [OK]
Hint: Remember: AT TIME ZONE changes time zones, not system settings [OK]
Common Mistakes:
Thinking it changes system time zone permanently
Confusing it with formatting functions
Assuming it removes time zone info
2. Which of the following is the correct syntax to convert a timestamp to 'America/New_York' time zone in PostgreSQL?
easy
A. SELECT timestamp_column AT TIMEZONE 'America/New_York';
B. SELECT timestamp_column AT TIME ZONE 'America/New_York';
C. SELECT timestamp_column AT TIMEZONE America/New_York;
D. SELECT timestamp_column AT TIME ZONE America/New_York;
Solution
Step 1: Recall correct syntax for AT TIME ZONE
The correct syntax uses two words: AT TIME ZONE followed by the time zone in single quotes.
Step 2: Check each option
Only SELECT timestamp_column AT TIME ZONE 'America/New_York'; matches the correct syntax exactly. The others either use AT TIMEZONE as one word (incorrect spelling) or miss quotes around the time zone name.
Final Answer:
SELECT timestamp_column AT TIME ZONE 'America/New_York'; -> Option B
Quick Check:
Use AT TIME ZONE 'zone' with quotes [OK]
Hint: Use two words: AT TIME ZONE with quotes around zone [OK]
Common Mistakes:
Writing AT TIMEZONE as one word
Omitting quotes around time zone
Using incorrect keyword order
3. Given the query:
SELECT '2024-06-01 12:00:00'::timestamp AT TIME ZONE 'UTC' AT TIME ZONE 'America/Los_Angeles';
What is the output timestamp?
medium
A. 2024-06-01 20:00:00
B. 2024-06-01 04:00:00
C. 2024-06-01 05:00:00
D. 2024-06-01 12:00:00
Solution
Step 1: Understand the query steps
The first AT TIME ZONE 'UTC' converts the timestamp without time zone to UTC timestamp with time zone. The second AT TIME ZONE 'America/Los_Angeles' converts that UTC time to Los Angeles local time.
Step 2: Calculate time difference
On June 1, Los Angeles is on PDT (UTC-7). So 12:00 UTC minus 7 hours is 05:00 local time. But since the query applies AT TIME ZONE twice, the final output is a timestamp without time zone in Los Angeles time, which is 05:00.
Final Answer:
2024-06-01 05:00:00 -> Option C
Quick Check:
UTC 12:00 minus 7 hours = 05:00 [OK]
Hint: Remember LA is UTC-7 in June; subtract 7 hours [OK]
Common Mistakes:
Confusing the order of AT TIME ZONE conversions
Ignoring daylight saving time offset
Assuming output is in UTC
4. Identify the error in this query:
SELECT '2024-06-01 12:00:00'::timestamp AT TIMEZONE 'Europe/London';
medium
A. The timestamp literal is missing time zone info.
B. The query is correct and will run without error.
C. The time zone name is invalid.
D. The keyword should be AT TIME ZONE with a space.
Solution
Step 1: Check the syntax of AT TIME ZONE
The query uses AT TIMEZONE as one word, which is incorrect syntax in PostgreSQL.
Step 2: Verify other parts
The timestamp literal is valid, and 'Europe/London' is a valid time zone name. So no error there.
Final Answer:
The keyword should be AT TIME ZONE with a space. -> Option D
Quick Check:
Use two words: AT TIME ZONE [OK]
Hint: Always write AT TIME ZONE as two words [OK]
Common Mistakes:
Writing AT TIMEZONE as one word
Assuming timestamp needs time zone info
Thinking time zone name is invalid
5. You have a timestamp with time zone column created_at stored in UTC. You want to display it as local time in 'Asia/Tokyo' but keep it as timestamp without time zone. Which query correctly does this?
hard
A. SELECT created_at AT TIME ZONE 'Asia/Tokyo' FROM orders;
B. SELECT created_at::timestamp AT TIME ZONE 'Asia/Tokyo' FROM orders;
C. SELECT (created_at AT TIME ZONE 'UTC') AT TIME ZONE 'Asia/Tokyo' FROM orders;
D. SELECT created_at AT TIME ZONE 'UTC' AT TIME ZONE 'Asia/Tokyo' FROM orders;
Solution
Step 1: Understand data type and conversion
created_at is timestamp with time zone in UTC. Applying AT TIME ZONE 'Asia/Tokyo' converts it to timestamp without time zone in Tokyo local time.
Step 2: Analyze options
SELECT created_at AT TIME ZONE 'Asia/Tokyo' FROM orders; correctly applies AT TIME ZONE 'Asia/Tokyo' to convert UTC timestamptz to local timestamp. SELECT created_at::timestamp AT TIME ZONE 'Asia/Tokyo' FROM orders; casts to timestamp first, losing time zone info before conversion, causing wrong result. The options that apply AT TIME ZONE 'UTC' first perform extra and incorrect conversions.
Final Answer:
SELECT created_at AT TIME ZONE 'Asia/Tokyo' FROM orders; -> Option A
Quick Check:
timestamptz AT TIME ZONE zone = local timestamp [OK]
Hint: Apply AT TIME ZONE directly on timestamptz to get local timestamp [OK]
Common Mistakes:
Casting timestamptz to timestamp before conversion
Applying multiple AT TIME ZONE conversions unnecessarily
Confusing timestamp with and without time zone
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.