📅  最后修改于: 2020-11-30 07:41:32             🧑  作者: Mango
在本节中,我们将了解PostgreSQL Timestamp数据类型的工作方式。我们还看到了Timestamp数据类型的示例,还看到了一些可访问的timestamp函数,例如NOW(),CURRENT_TIMESTAMP,CURRENT_TIME,TIMEOFDAY()和timezone(zone,timestamp) ,它们有助于我们更有效地处理时间值。
在PostgreSQL中,下一个数据类型是TIMESTAMP ,它可以存储TIME和DATE值。但是它不支持任何时区数据。这意味着当我们转换数据库服务器的时区时,时间戳记值将存储在数据库中并且不能重复修改。
在PostgreSQL中,TIMESTAMP数据类型分为两种时间数据类型,如下所示:
时间戳记:时间戳记数据类型不使用时区一。
Timestamptz :timestamptz数据类型与时区一起使用。
注意:
SELECT typname, typlen
FROM pg_type
WHERE typname ~ '^timestamp';
输出量
激活上面的命令后,我们将获得以下输出,在这里我们可以看到timestamp和timestamptz数据类型都存储了8个字节的时间戳值。
在PostgreSQL中, timestamptz数据类型存储在UTC值中:
PostgreSQL时间戳数据类型的语法如下:
TIMESTAMP;
要么
TIMESTAMPTZ;
让我们看一个示例示例,以了解PostgreSQL时间戳和timestamptz数据类型如何工作。
我们正在创建一个名为ts_demo的新表,该表在CREATE命令的帮助下包含timestamp和timestamptz数据类型,并使用INSERT命令插入一些值。
要将ts_demo创建到Javatpoint数据库中,请使用CREATE命令。
ts_demo表包含两列,例如ts1 TIMESTAMP和ts2 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数据值,因为它总是一个好习惯。
我们具有以下时间戳功能,例如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时间戳记”数据类型部分中,我们学习了以下主题: