PostgreSQL 时间戳17 Mar 2025 | 6 分钟阅读 在本节中,我们将了解 PostgreSQL 时间戳数据类型 的工作原理。我们还将看到 时间戳数据类型 的 示例,以及一些易于访问的时间戳函数,如 NOW()、CURRENT_TIMESTAMP、CURRENT_TIME、TIMEOFDAY() 和 timezone(zone, timestamp),它们有助于我们更有效地处理时间值。 什么是 PostgreSQL 时间戳数据类型?在 PostgreSQL 中,下一个数据类型是 TIMESTAMP,它可以存储 TIME 和 DATE 值。但它不支持任何 时区数据。这意味着当我们转换数据库服务器的 时区 时,时间戳值 将会存储在数据库中,并且不能重复修改。 在 PostgreSQL 中,TIMESTAMP 数据类型分为 两种时间数据类型,如下所示:
Timestamp:该时间戳数据类型是 不带时区 的。 Timestamptz:该 timestamptz 数据类型是 带时区 的。 注意
输出 执行上述命令后,我们将看到以下输出,其中我们可以看到 timestamp 和 timestamptz 数据类型都存储 8 字节 的时间戳值。 ![]() 在 PostgreSQL 中,timestamptz 数据类型以 UTC 值 存储。
PostgreSQL 时间戳数据类型语法PostgreSQL 时间戳数据类型的语法如下: 或 PostgreSQL TIMESTAMP 数据类型示例让我们看一个示例,以了解 PostgreSQL timestamp 和 timestamptz 数据类型 的工作原理。 我们正在创建一个名为 ts_demo 的新表,该表使用 CREATE 命令包含 timestamp 和 timestamptz 数据类型,并使用 INSERT 命令插入一些值。 要将 ts_demo 创建到 Javatpoint 数据库 中,我们使用 CREATE 命令。 ts_demo 表包含两个列,如 ts1 TIMESTAMP 和 ts2 TIMESTAMPTZ,如下面的命令所示。 输出 执行上述命令后,我们将收到以下消息:ts_demo 表已成功创建。 ![]() 在 ts_demo 表成功创建后,我们将 数据库服务器的时区 设置为 Australia/Darwin,如下面的命令所示。 输出 在实施上述命令后,我们将看到以下消息窗口,其中显示时区已成功设置。 ![]() 如果我们想查看 当前时区,我们可以使用以下命令,如下所示: 输出 执行上述命令后,我们将获得以下输出 ![]() 在成功将时区设置为 Australia/Darwin 后,我们将使用 INSERT 命令插入一些值。 输出 在实施上述命令后,我们将看到以下消息窗口,其中显示特定值已成功插入到 ts_demo 表中。 ![]() 在创建并插入 ts_demo 表的值之后,我们将使用 SELECT 命令返回 ts_demo 表的所有行。 输出 成功执行上述命令后,我们将看到以下输出,其中显示了 ts_demo 表中的时间戳值。 ![]() 之后,我们将再次将当前会话的时区修改为 Asia/Calcutta,如下面的命令所示。 输出 执行上述命令后,我们将看到以下消息窗口,其中显示新时区已成功设置。 ![]() 然后,我们将使用 SELECT 命令查看 ts_demo 表中的现有数据。 输出 成功执行上述命令后,我们将获得以下结果: ![]() 正如我们所见,timestamp 列中的两个输出值都没有改变,而 timestamptz 列 中的值会根据新的 'Asia/Calcutta' 时区而改变。 注意:通常,我们会使用 timestamptz 数据类型来存储时间戳数据值,因为这总是一个好习惯。PostgreSQL 时间戳函数我们有以下 时间戳函数,例如 NOW()、CURRENT_TIMESTAMP、CURRENT_TIME、TIMEOFDAY(),以及使用 timezone(zone, timestamp) 函数 将时间值转换为不同时区,这些函数在 PostgreSQL 中提供了对时间值的处理能力,有助于提高我们使用 时间戳数据类型 时的性能。 让我们看一些不同的示例,以了解 PostgreSQL 时间戳函数 的工作原理。 获取当前时间我们可以使用 NOW() 函数来检索 当前时间戳。 要返回数据库服务器的当前时间戳,我们可以使用以下命令: 输出 执行上述命令后,我们将在输出中得到 当前时间戳(借助 NOW() 函数),如下所示: ![]() 或者我们也可以使用 CURRENT_TIMESTAMP 函数来获取带时区的当前时间戳。 输出 执行上述命令后,我们将在输出中得到带时区的 当前时间戳(借助 CURRENT_TIMESTAMP 函数),如下所示: ![]() 我们可以使用 CURRENT_TIME 函数,它有助于我们检索当前时间而不带日期。 注意:CURRENT_TIMESTAMP 和 CURRENT_TIME 这两个函数都用于返回带时区的当前时间。在 PostgreSQL 中,我们还可以使用 timeofday() 函数以 字符串格式 检索 当天的时间,如下面的命令所示。 输出 成功执行上述命令后,我们将在输出中以字符串格式得到当天的时间(借助 TIMEOFDAY() 函数),如下所示: ![]() 时区之间的转换我们可以使用 timezone(zone, timestamp) 函数将时间戳转换为另一个时区。 以下语法用于将时间转换为不同的时区: 首先,我们将使用以下命令查看 当前时区,如下所示: 输出 执行上述命令后,我们将看到以下输出,其中显示数据库服务器的 当前时区 是 Asia/Calcutta。 ![]() 让我们看一个示例,以帮助我们更好地理解。 现在,我们将使用 timezone() 函数将 当前时区 的 2020-10-06 00:00 转换为 Australia/Sydney 时区,如下面的命令所示。 输出 执行上述命令后,我们将得到以下输出,其中显示了基于 Australia/Sydney 时区的转换后的时间。 ![]() 注意:如果我们向 timezone() 函数提供字符串格式的时间戳,PostgreSQL 会间接执行 timestamptz。将 timestamp 值直接转换为 timestamptz 数据类型,因为这始终是一个很好的方法,如下面的命令所示。 输出 成功执行上述命令后,我们将看到以下输出,其中显示了使用 timestamptz 数据 类型但没有时区的时间的转换。 ![]() 概述在 PostgreSQL 时间戳数据类型 部分,我们学习了以下主题:
|
我们请求您订阅我们的新闻通讯以获取最新更新。