DEV Community

Cover image for What is the difference between DATETIME and TIMESTAMP data type in MySQL?
Bobby Iliev
Bobby Iliev

Posted on • Originally published at devdojo.com

What is the difference between DATETIME and TIMESTAMP data type in MySQL?

Introduction

If you have ever worked with MySQL and had to create your table structure, you have probably noticed that the DATETIME and TIMESTAMP data types are quite similar at a first glance as they have a lot of similarities.

In this tutorial, we will go over each one of them and learn the main differences between both so that you could know when you should use them.

https://stackoverflow.com/questions/409286/should-i-use-the-datetime-or-timestamp-data-type-in-mysql

DATETIME

The DATETIME type is used for values that contain both the date and the time.

For example, when retrieving the value, MySQL will display it in the following format: YYYY-MM-DD hh:mm:ss.

An important distinction is that the range that is currently supported is 1000-01-01 00:00:00 to 9999-12-31 23:59:59.

You can think of DATETIME as a literal value, as it stores the date and the time but has no reference to a specific timezone. So when you store the value of NOW(), for example, the server time zone will be used. Once inserted, the value of the DATETIME will remain the same regardless of any current sessions.

This is an important distinction that will get a bit clearer once you go over the example below.

TIMESTAMP

Just as DATETIME, the TIMESTAMP data type contains both the date and the time in the following format YYYY-MM-DD hh:mm:ss.

However, unlike DATETIME, the TIMESTAMP data type has a fixed range between 1970-01-01 00:00:01 UTC to 2038-01-19 03:14:07 UTC. You should always consider this limit as it might not be suitable for all applications and use cases. For more information on why this specific range, make sure to read more about the Unix Time.

An important thing to keep in mind is that when you display the values of a TIMESTAMP column, they would be converted to the current time zone. What happens is that MySQL would convert the TIMESTAMP values from the current time zone to UTC when storing them, but then it would convert the values back from UTC to the current time zone of the retrieval.

Let's go through the following example to make this a bit more clear!

Example

Let's create a very simple table with just two columns for each of the two data types:



CREATE TABLE demo_table(
    datetime_column DATETIME,
    timestamp_column TIMESTAMP
);


Enter fullscreen mode Exit fullscreen mode

Then let's insert the same values in both using NOW():



INSERT INTO demo_table VALUES ((NOW()),(NOW()));


Enter fullscreen mode Exit fullscreen mode

Then check the values of both columns:



SELECT * FROM demo_table;

// Output
+---------------------+---------------------+
| datetime_column     | timestamp_column    |
+---------------------+---------------------+
| 2021-12-04 17:42:16 | 2021-12-04 17:42:16 |
+---------------------+---------------------+


Enter fullscreen mode Exit fullscreen mode

So far the values of both columns are the same. But then let's check the current time zone:



SHOW VARIABLES LIKE '%time_zone%';

// Output
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | UTC    |
| time_zone        | SYSTEM |
+------------------+--------+


Enter fullscreen mode Exit fullscreen mode

Next, let's change the time zone for our current session:



SET time_zone="America/New_york";


Enter fullscreen mode Exit fullscreen mode

Note: if you get the following error: ERROR 1298 (HY000): Unknown or incorrect time zone: 'America/new_york' you can run the following command in another terminal window:



mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql


Enter fullscreen mode Exit fullscreen mode

After that let's see how the output values change:



SELECT * FROM demo_table;

// Output
+---------------------+---------------------+
| datetime_column     | timestamp_column    |
+---------------------+---------------------+
| 2021-12-04 17:42:16 | 2021-12-04 12:42:16 |
+---------------------+---------------------+


Enter fullscreen mode Exit fullscreen mode

As you can see, the displayed value of the datetime_column remained the same but the timestamp_column value changed and is now referencing our current time zone.

Conclusion

This is all! Now you should have a better idea of what the main differences between datetime and timestamp are!

In case that you want to learn more about SQL in general, I would recommend the following free eBook:

In case that you are already using SQL on daily basis, and are looking for a way to drastically reduce the latency of your data analytics, make sure to out Materialize!

Materialize - a streaming database

Materialize is a Streaming Database for Real-time Analytics. It is a reactive database that delivers incremental view updates and it helps developers easily build with streaming data using standard SQL.

Top comments (2)

Collapse
 
pathakpratik profile image
Pratik Pathak

So should we go with datetime or timestamp column in all mysql tables?

Collapse
 
bobbyiliev profile image
Bobby Iliev

Timestamps in MySQL are generally used to track changes to records, and are often updated every time the record is changed. If you want to store a specific value you should use a datetime field.