PostgreSQL 教程: now 函数

九月 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_TIMECURRENT_TIMESTAMP来获取带时区的当前日期和时间:

SELECT CURRENT_TIME, CURRENT_TIMESTAMP;
       timetz       |              now
--------------------+-------------------------------
 18:50:51.191353-07 | 2017-03-17 18:50:51.191353-07
(1 row)

要获取不带时区的当前日期和时间,可以使用LOCALTIMELOCALTIMESTAMP函数。

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()函数,获取带时区的当前日期和时间。