九月 18, 2023
摘要:本教程向您展示如何使用 PostgreSQL 的 NOW() 函数,获取带时区的日期和时间。
目录
PostgreSQL NOW() 函数简介
NOW()
函数返回当前日期和时间。NOW()
函数的返回类型是带有时区的时间戳(timestamp with time zone
)。请参见以下示例:
SELECT NOW();
now
-------------------------------
2017-03-18 08:21:36.175627+07
(1 row)
请注意,NOW()
函数根据数据库服务器的时区设置返回当前日期和时间。
例如,如果我们将时区更改为 “America/Los_Angeles”:
SET TIMEZONE='America/Los_angeles';
并获取当前日期和时间:
SELECT NOW();
now
-------------------------------
2017-03-17 18:29:21.758315-07
(1 row)
如您所见,NOW()
函数返回的值已调整为新的时区。
如果你想获取没有时区的当前日期和时间,你可以显式地转换它,如下所示:
SELECT NOW()::timestamp;
now
----------------------------
2017-03-17 18:37:29.229991
(1 row)
您可以对NOW()
函数使用常见的日期和时间运算符。例如,要获得现在往后 1 小时的时间:
SELECT (NOW() + interval '1 hour') AS an_hour_later;
an_hour_later
-------------------------------
2017-03-17 19:42:37.110567-07
(1 row)
要获得明天的这个时间,可以在当前时间上增加 1 天:
SELECT (NOW() + interval '1 day') AS this_time_tomorrow;
this_time_tomorrow
-------------------------------
2017-03-17 19:43:35.178882-07
(1 row)
要获得 2 小时 30 分钟前的时间,请使用减号 (-
) 运算符,如下所示:
SELECT now() - interval '2 hours 30 minutes' AS two_hour_30_min_go;
two_hour_30_min_go
-------------------------------
2017-03-17 16:17:07.742688-07
(1 row)
PostgreSQL NOW() 相关函数
除了NOW()
函数之外,您还可以使用CURRENT_TIME
或CURRENT_TIMESTAMP
来获取带时区的当前日期和时间:
SELECT CURRENT_TIME, CURRENT_TIMESTAMP;
timetz | now
--------------------+-------------------------------
18:50:51.191353-07 | 2017-03-17 18:50:51.191353-07
(1 row)
要获取不带时区的当前日期和时间,可以使用LOCALTIME
和LOCALTIMESTAMP
函数。
SELECT LOCALTIME, LOCALTIMESTAMP;
time | timestamp
-----------------+----------------------------
19:13:41.423371 | 2017-03-17 19:13:41.423371
(1 row)
请注意,NOW()
及其相关函数返回当前事务的开始时间。换句话说,函数调用的返回值在事务内是相同的。
下面的例子说明了这个概念:
postgres=# BEGIN;
BEGIN
postgres=# SELECT now();
now
-------------------------------
2017-03-17 19:21:43.049715-07
(1 row)
postgres=# SELECT pg_sleep(3);
pg_sleep
----------
(1 row)
postgres=# SELECT now();
now
-------------------------------
2017-03-17 19:21:43.049715-07
(1 row)
postgres=# COMMIT;
COMMIT
在此示例中,我们在事务中调用NOW()
函数,正如您所看到的,它的返回值不会在事务中发生变化。
请注意,pg_sleep()
函数会暂停当前会话的进程,睡眠指定的秒数。
如果您想获取事务过程中实时的当前日期和时间,可以使用TIMEOFDAY()
函数。考虑以下示例:
SELECT
TIMEOFDAY(),
pg_sleep(5),
TIMEOFDAY();
timeofday | pg_sleep | timeofday
-------------------------------------+----------+-------------------------------------
Fri Mar 17 19:36:09.216064 2017 PDT | | Fri Mar 17 19:36:14.217636 2017 PDT
(1 row)
如您所见,暂停 5 秒后,当前日期和时间增加了。
PostgreSQL NOW() 函数作为默认值
您可以使用NOW()
函数作为表列的默认值。请参见以下示例:
首先,创建一个新表,名为 posts,其中的created_at
列具有由NOW()
函数提供的默认值:
CREATE TABLE posts (
id SERIAL PRIMARY KEY,
title VARCHAR NOT NULL,
created_at TIMESTAMPTZ DEFAULT Now()
);
其次,向posts
表中插入新行:
INSERT INTO posts (title)
VALUES ('PostgreSQL NOW function');
第三步,从posts
表中查询数据:
SELECT * FROM posts;
id | title | created_at
----+-------------------------+-------------------------------
1 | PostgreSQL NOW function | 2017-03-18 09:41:26.208497+07
(1 row)
即使我们没有提供created_at
列的值,该语句也使用NOW()
函数返回的值作为该列的值。
在本教程中,您学习了如何使用 PostgreSQL 的NOW()
函数,获取带时区的当前日期和时间。
了解更多
PostgreSQL 教程:日期函数
PostgreSQL 文档:时间/日期函数和操作符