Sling Academy
Home/PostgreSQL/TIMESTAMP and TIMESTAMPTZ data types in PostgreSQL (7 examples)

TIMESTAMP and TIMESTAMPTZ data types in PostgreSQL (7 examples)

Last updated: January 04, 2024

Overview

PostgreSQL provides two time-based data types, TIMESTAMP and TIMESTAMPTZ, which are often a source of confusion. TIMESTAMP stores a date and time pair without timezone information, while TIMESTAMPTZ includes time zone data for timezone-aware applications.

Understanding TIMESTAMP

Let’s start by understanding the basic TIMESTAMP data type. In PostgreSQL, TIMESTAMP is a data type that stores date and time values without any information about time zones. It’s essentially a ‘timestamp without time zone’. It assumes that the stored time value is in the same time zone that the database server is operating in, whatever that may be.

Example 1: Creating a Table with a TIMESTAMP Field

CREATE TABLE events (
  id SERIAL PRIMARY KEY,
  event_name VARCHAR(100),
  event_time TIMESTAMP
);

This example creates a table named ‘events’ with an id field, an event_name field, and an event_time field that records the timestamp of the event.

Example 2: Inserting Data into TIMESTAMP Field

INSERT INTO events (event_name, event_time)
VALUES ('Product Launch', '2023-04-15 14:30:00');

This statement inserts a new row into the ‘events’ table, with a specific timestamp for the ‘Product Launch’ event.

Dealing With Time Zones in TIMESTAMP

An essential aspect of dealing with TIMESTAMP data is considering how the absence of time zone information can affect the interpretation of the stored dates and times.

Example 3: Retrieving TIMESTAMP Data

SELECT event_name, event_time
FROM events;

Running this query will display the ‘event_time’ exactly as it was inserted without any conversion for time zones.

Understanding TIMESTAMPTZ

TIMESTAMPTZ is short for ‘timestamp with time zone’. This data type stores the timestamp along with information about the time zone. PostgreSQL does behind the scenes adjustments to convert stored values to Coordinated Universal Time (UTC). When retrieved, these timestamps are converted back to the appropriate time zone of the client, if that time zone is set.

Example 4: Creating a Table with a TIMESTAMPTZ Field

CREATE TO events_tz (
  id SERIAL PRIMARY KEY,
  event_name VARCHAR(100),
  event_time  TIMESTAMPTZ
);

This SQL statement creates a similar ‘events’ table, but this time the ‘event_time’ field is a TIMESTAMPTZ field, meaning that it will store time zone information alongside the timestamp.

Example 5: Inserting Data into TIMESTAMPTZ Field

INSERT INTO events_tz (event_name, event_time)
VALUES ('Global Webinar', '2023-04-15 14:30:00+00');

In this example, the ‘+00’ indicates that the ‘Global Webinar’ event time is set to UTC. PostgreSQL will store this time internally in UTC.

Working with Client Time Zones in TIMESTAMPTZ

The real utility of TIMESTAMPTZ emerges when we recognize that users from different time zones might interact with our database.

Example 6: Retrieving Data in Different Time Zones

-- Setting the time zone
SET TIME ZONE 'Asia/Kolkata';
-- Retrievring event time in set time zone
SELECT event_name, event_time
FROM events_tz;

This retrieval converts the UTC time stored in the database to ‘Asia/Kolkata’ time zone before presenting it to the user.

Conversions Between TIMESTAMP and TIMESTAMPTZ

Conversion functions allow you to switch from one type to the other, adapting your data to the needs of your application.

Example 7: Converting TIMESTAMP to TIMESTAMPTZ

SELECT event_name, event_time AT TIME ZONE 'UTC'
FROM events;

This query takes the ‘event_time’ which is a TIMESTAMP, and displays it as if it were a TIMESTAMPTZ in UTC time.

Conclusion.

So far, we have discussed the use of TIMESTAMP and TIMESTAMPTZ in everyday scenarios. Understanding the proper use of time data types in PostgreSQL is essential for dealing with temporal data correctly. This tutorial provides a comprehensive explanation of the TIMESTAMP and TIMESTAMPTZ data types, including how they handle time zones and how they can affect your applications when dealing with time-based data. At this point, you should be able to use these data types more confidently and correctly in your PostgreSQL database.

Next Article: How to generate and use UUIDs in PostgreSQL

Previous Article: A deep dive into PostgreSQL DATE and TIME data types

Series: PostgreSQL Tutorials: From Basic to Advanced

PostgreSQL

You May Also Like

  • PostgreSQL with TimescaleDB: Querying Time-Series Data with SQL
  • PostgreSQL Full-Text Search with Boolean Operators
  • Filtering Stop Words in PostgreSQL Full-Text Search
  • PostgreSQL command-line cheat sheet
  • How to Perform Efficient Rolling Aggregations with TimescaleDB
  • PostgreSQL with TimescaleDB: Migrating from Traditional Relational Models
  • Best Practices for Maintaining PostgreSQL and TimescaleDB Databases
  • PostgreSQL with TimescaleDB: Building a High-Performance Analytics Engine
  • Integrating PostgreSQL and TimescaleDB with Machine Learning Models
  • PostgreSQL with TimescaleDB: Implementing Temporal Data Analysis
  • Combining PostgreSQL, TimescaleDB, and Airflow for Data Workflows
  • PostgreSQL with TimescaleDB: Visualizing Real-Time Data with Superset
  • Using PostgreSQL with TimescaleDB for Energy Consumption Analysis
  • PostgreSQL with TimescaleDB: How to Query Massive Datasets Efficiently
  • Best Practices for Writing Time-Series Queries in PostgreSQL with TimescaleDB
  • PostgreSQL with TimescaleDB: Implementing Batch Data Processing
  • Using PostgreSQL with TimescaleDB for Network Traffic Analysis
  • PostgreSQL with TimescaleDB: Troubleshooting Common Performance Issues
  • Building an IoT Data Pipeline with PostgreSQL and TimescaleDB