PostgreSQL 时间戳

17 Mar 2025 | 6 分钟阅读

在本节中,我们将了解 PostgreSQL 时间戳数据类型 的工作原理。我们还将看到 时间戳数据类型示例,以及一些易于访问的时间戳函数,如 NOW()、CURRENT_TIMESTAMP、CURRENT_TIME、TIMEOFDAY() 和 timezone(zone, timestamp),它们有助于我们更有效地处理时间值。

什么是 PostgreSQL 时间戳数据类型?

在 PostgreSQL 中,下一个数据类型是 TIMESTAMP,它可以存储 TIMEDATE 值。但它不支持任何 时区数据。这意味着当我们转换数据库服务器的 时区 时,时间戳值 将会存储在数据库中,并且不能重复修改。

在 PostgreSQL 中,TIMESTAMP 数据类型分为 两种时间数据类型,如下所示:

  • 时间戳
  • timpstamptz

Timestamp:该时间戳数据类型是 不带时区 的。

Timestamptz:该 timestamptz 数据类型是 带时区 的。

注意

  • timestamptz 数据类型 是一种与时区相关的 日期和时间 数据类型,它是 带时区的时间戳
  • timestamp 和 timestamptz 存储 8 字节的存储空间 来存储时间戳值,如下面的命令所示。

输出

执行上述命令后,我们将看到以下输出,其中我们可以看到 timestamp 和 timestamptz 数据类型都存储 8 字节 的时间戳值。

PostgreSQL Timestamp

在 PostgreSQL 中,timestamptz 数据类型以 UTC 值 存储。

  • 如果我们向 timestamptz 列插入一个值,PostgreSQL 会将 timestamptz 值更改为 UTC 值,并将 UTC 值存储在表中。
  • 如果我们从数据库请求 timestamptz,PostgreSQL 会将 UTC 值 转换回由数据库服务器、当前数据库连接或用户建立的 时区
  • 并且 PostgreSQL 不包含 timestamptz 的任何 时区 数据。

PostgreSQL 时间戳数据类型语法

PostgreSQL 时间戳数据类型的语法如下:

PostgreSQL TIMESTAMP 数据类型示例

让我们看一个示例,以了解 PostgreSQL timestamp 和 timestamptz 数据类型 的工作原理。

我们正在创建一个名为 ts_demo 的新表,该表使用 CREATE 命令包含 timestamptimestamptz 数据类型,并使用 INSERT 命令插入一些值。

要将 ts_demo 创建到 Javatpoint 数据库 中,我们使用 CREATE 命令。

ts_demo 表包含两个列,如 ts1 TIMESTAMPts2 TIMESTAMPTZ,如下面的命令所示。

输出

执行上述命令后,我们将收到以下消息:ts_demo 表已成功创建。

PostgreSQL Timestamp

ts_demo 表成功创建后,我们将 数据库服务器的时区 设置为 Australia/Darwin,如下面的命令所示。

输出

在实施上述命令后,我们将看到以下消息窗口,其中显示时区已成功设置。

PostgreSQL Timestamp

如果我们想查看 当前时区,我们可以使用以下命令,如下所示:

输出

执行上述命令后,我们将获得以下输出

PostgreSQL Timestamp

在成功将时区设置为 Australia/Darwin 后,我们将使用 INSERT 命令插入一些值。

输出

在实施上述命令后,我们将看到以下消息窗口,其中显示特定值已成功插入到 ts_demo 表中。

PostgreSQL Timestamp

在创建并插入 ts_demo 表的值之后,我们将使用 SELECT 命令返回 ts_demo 表的所有行。

输出

成功执行上述命令后,我们将看到以下输出,其中显示了 ts_demo 表中的时间戳值。

PostgreSQL Timestamp

之后,我们将再次将当前会话的时区修改为 Asia/Calcutta,如下面的命令所示。

输出

执行上述命令后,我们将看到以下消息窗口,其中显示新时区已成功设置。

PostgreSQL Timestamp

然后,我们将使用 SELECT 命令查看 ts_demo 表中的现有数据。

输出

成功执行上述命令后,我们将获得以下结果:

PostgreSQL Timestamp

正如我们所见,timestamp 列中的两个输出值都没有改变,而 timestamptz 列 中的值会根据新的 'Asia/Calcutta' 时区而改变。

注意:通常,我们会使用 timestamptz 数据类型来存储时间戳数据值,因为这总是一个好习惯。

PostgreSQL 时间戳函数

我们有以下 时间戳函数,例如 NOW()、CURRENT_TIMESTAMP、CURRENT_TIME、TIMEOFDAY(),以及使用 timezone(zone, timestamp) 函数 将时间值转换为不同时区,这些函数在 PostgreSQL 中提供了对时间值的处理能力,有助于提高我们使用 时间戳数据类型 时的性能。

让我们看一些不同的示例,以了解 PostgreSQL 时间戳函数 的工作原理。

获取当前时间

我们可以使用 NOW() 函数来检索 当前时间戳

要返回数据库服务器的当前时间戳,我们可以使用以下命令:

输出

执行上述命令后,我们将在输出中得到 当前时间戳(借助 NOW() 函数),如下所示:

PostgreSQL Timestamp

或者我们也可以使用 CURRENT_TIMESTAMP 函数来获取带时区的当前时间戳。

输出

执行上述命令后,我们将在输出中得到带时区的 当前时间戳(借助 CURRENT_TIMESTAMP 函数),如下所示:

PostgreSQL Timestamp

我们可以使用 CURRENT_TIME 函数,它有助于我们检索当前时间而不带日期。

注意:CURRENT_TIMESTAMP 和 CURRENT_TIME 这两个函数都用于返回带时区的当前时间。

在 PostgreSQL 中,我们还可以使用 timeofday() 函数以 字符串格式 检索 当天的时间,如下面的命令所示。

输出

成功执行上述命令后,我们将在输出中以字符串格式得到当天的时间(借助 TIMEOFDAY() 函数),如下所示:

PostgreSQL Timestamp

时区之间的转换

我们可以使用 timezone(zone, timestamp) 函数将时间戳转换为另一个时区。

以下语法用于将时间转换为不同的时区:

首先,我们将使用以下命令查看 当前时区,如下所示:

输出

执行上述命令后,我们将看到以下输出,其中显示数据库服务器的 当前时区Asia/Calcutta

PostgreSQL Timestamp

让我们看一个示例,以帮助我们更好地理解。

现在,我们将使用 timezone() 函数将 当前时区2020-10-06 00:00 转换为 Australia/Sydney 时区,如下面的命令所示。

输出

执行上述命令后,我们将得到以下输出,其中显示了基于 Australia/Sydney 时区的转换后的时间。

PostgreSQL Timestamp

注意:如果我们向 timezone() 函数提供字符串格式的时间戳,PostgreSQL 会间接执行 timestamptz。

timestamp 值直接转换为 timestamptz 数据类型,因为这始终是一个很好的方法,如下面的命令所示。

输出

成功执行上述命令后,我们将看到以下输出,其中显示了使用 timestamptz 数据 类型但没有时区的时间的转换。

PostgreSQL Timestamp

概述

PostgreSQL 时间戳数据类型 部分,我们学习了以下主题:

  • PostgreSQL 时间戳数据 类型用于存储指定列的时间和日期值。
  • 我们使用了不同的 TIMESTAMP 函数,例如 NOW()、CURRENT_TIMESTAMP、CURRENT_TIME、TIMEOFDAY() 和 timezone(zone, timestamp) 来增强和处理特定表中的 TIME 和 DATE 值。
  • 我们可以使用 timezone(zone, timestamp) 函数时间戳值 更改为 不同的时区