📜  PostgreSQL时间戳

📅  最后修改于: 2020-11-30 07:41:32             🧑  作者: Mango

PostgreSQL时间戳

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

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

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

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

  • 时间戳记
  • 廷普斯坦普茨

时间戳记:时间戳记数据类型不使用时区一

Timestamptz :timestamptz数据类型与时区一起使用

注意:

  • timestamptz数据类型是与时区相关的日期和时间数据类型,它是带有time zone的时间戳。
  • 时间戳和时间戳存储了时间戳值的8个字节的存储空间,如以下命令所示:
SELECT typname, typlen
FROM pg_type
WHERE typname ~ '^timestamp'; 

输出量

激活上面的命令后,我们将获得以下输出,在这里我们可以看到timestamp和timestamptz数据类型都存储了8个字节的时间戳值。

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

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

PostgreSQL时间戳数据类型的语法

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

TIMESTAMP; 

要么

TIMESTAMPTZ;

PostgreSQL TIMESTAMP数据类型的示例

让我们看一个示例示例,以了解PostgreSQL时间戳和timestamptz数据类型如何工作。

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

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

ts_demo表包含两列,例如ts1 TIMESTAMPts2 TIMESTAMPTZ,如以下命令所示:

CREATE TABLE ts_demo (
    ts1 TIMESTAMP, 
    ts2 TIMESTAMPTZ
);

输出量

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

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

SET TIMEZONE ='Australia/Darwin';

输出量

执行上述命令后,我们将获得以下消息窗口,该窗口显示时区已成功设置。

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

SHOW TIMEZONE;

输出量

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

成功将时区设置为“澳大利亚/达尔文”后,我们将在INSERT命令的帮助下向其中插入一些值。

INSERT INTO ts_demo (ts1, ts2)
VALUES('2020-10-05 14:01:10-08',
       '2020-10-05 14:01:10-08');

输出量

实施上述命令后,我们将获得以下消息窗口,该窗口显示特定值已成功插入ts_demo表。

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

SELECT ts1, ts2
FROM ts_demo;

输出量

成功执行上述命令后,我们将获得以下输出,该输出显示ts_demo表中存在的时间戳值:

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

SET TIMEZONE = 'Asia/Calcutta';

输出量

实施上述命令后,我们将获得以下消息窗口,该窗口显示新时区已成功设置。

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

SELECT ts1, ts2
FROM ts_demo;

输出量

成功执行以上命令后,我们将检索以下结果:

我们可以看到,无论是输出值在timestamp列不修改,但是在timestamptz列中的值可以根据“亚洲/加尔各答”的新时区改变。

注意:通常,我们将使用timestamptz数据类型来存储timestamp数据值,因为它总是一个好习惯。

PostgreSQL时间戳功能

我们具有以下时间戳功能,例如NOW(),CURRENT_TIMESTAMP,CURRENT_TIME,TIMEOFDAY(),它们使用PostgreSQL中可用的时间值的timezone(zone,timestamp)函数将时间值转换为不同的时区,这有助于我们增强功能使用timestamp数据类型时的性能

让我们看不同的示例,以了解PostgreSQL时间戳函数如何工作。

获取当前时间

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

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

SELECT NOW();

输出量

实施上述命令后,我们将在输出中借助NOW()函数获取当前时间戳,如下所示:

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

SELECT CURRENT_TIMESTAMP;

输出量

实施上述命令后,我们将在输出中使用CURRENT_TIMESTAMP函数获取带有时区的当前时间戳,如下所示:

我们可以使用CURRENT_TIME函数,该函数可以帮助我们检索没有日期的当前时间。

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

在PostgreSQL中,我们还可以借助timeofday()函数以字符串格式检索一天中的时间,如以下命令所示:

SELECT TIMEOFDAY();

输出量

成功执行上述命令后,我们将在输出中使用TIMEOFDAY()函数以字符串格式获取一天中的时间,如下所示:

时区之间的修改

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

以下语法用于将时间更改为其他时区:

SELECT timezone(zone, timestamp) ;

首先,我们将在以下命令的帮助下看到当前时区,如下所示:

SHOW TIMEZONE;

输出量

执行完上述命令后,我们将获得以下输出,该输出显示数据库服务器中当前时区Asia / Calcutta:

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

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

SELECT timezone('Australia/Sydney','2020-10-06 02:14');

输出量

实现上述命令后,我们将获得以下输出,该命令显示基于澳大利亚/悉尼时区的修改时间:


注意:如果我们将timestamp作为字符串给timezone()函数, PostgreSQL将间接执行timestamptz。

直接将时间戳值转换为timestamptz数据类型,因为这总是一种极好的方法,如以下命令所示:

SELECT timezone('America/New_York','2016-06-01 00:00'::timestamptz);

输出量

成功执行以上命令后,我们将获得以下输出,该命令显示带有timestamptz数据类型的无时间转换时间。

总览

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

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