使用当前时间(UTC)作为PostgreSQL的默认值。

26 浏览
0 Comments

使用当前时间(UTC)作为PostgreSQL的默认值。

我有一个TIMESTAMP WITHOUT TIME ZONE类型的列,并希望将其默认设置为当前的UTC时间。获取当前的UTC时间很容易:\n

postgres=# select now() at time zone 'utc';
          timezone          
----------------------------
 2013-05-17 12:52:51.337466
(1 row)

\n使用当前时间戳作为列的默认值也很简单:\n

postgres=# create temporary table test(id int, ts timestamp without time zone default current_timestamp);
CREATE TABLE
postgres=# insert into test values (1) returning ts;
             ts             
----------------------------
 2013-05-17 14:54:33.072725
(1 row)

\n但是这使用的是本地时间。试图强制将其转换为UTC会导致语法错误:\n

postgres=# create temporary table test(id int, ts timestamp without time zone default now() at time zone 'utc');
ERROR:  syntax error at or near "at"
LINE 1: ...int, ts timestamp without time zone default now() at time zo...

0
0 Comments

在PostgreSQL中,有一个问题是如果我们想要使用当前时间作为默认值,但是以UTC时间为基准,那么应该如何实现呢?

解决方法是可以将其封装在一个函数中,具体步骤如下:

首先,创建一个函数,函数名为now_utc(),返回类型为timestamp。函数内部的SQL语句是通过select语句来获取当前时间,并通过at time zone 'utc'将其转换为UTC时间。

create function now_utc() returns timestamp as $$
  select now() at time zone 'utc';
$$ language sql;

然后,我们可以创建一个临时表test,并设置一个名为ts的字段,字段类型为timestamp without time zone,并且将默认值设置为now_utc()函数。

create temporary table test(
  id int,
  ts timestamp without time zone default now_utc()
);

通过以上步骤,我们成功地解决了在PostgreSQL中使用当前时间作为默认值,并以UTC时间为基准的问题。

0
0 Comments

使用当前时间作为默认值时,需要考虑时区的问题。在PostgreSQL中,默认情况下,使用的是本地时区的时间。然而,有时候我们需要使用协调世界时(UTC)作为默认值。

解决方法之一是使用timezone('utc', now())函数。这个函数将当前时间转换为UTC时间并返回。通过将这个函数作为默认值,我们可以确保使用UTC时间作为默认值。

这种解决方法的好处是,无论在哪个时区运行代码,都可以获得相同的结果。这对于多时区的应用程序非常有用。

例如,假设我们有一个名为"created_at"的字段,它在插入新记录时应该自动设置为当前时间。我们可以通过以下方式将其设置为UTC时间的默认值:

ALTER TABLE table_name ALTER COLUMN created_at SET DEFAULT timezone('utc', now());

这将确保在每次插入新记录时,"created_at"字段都会自动设置为当前的UTC时间。

通过使用timezone('utc', now())函数,我们可以将当前时间设置为UTC时间的默认值。这样可以确保在不同的时区中获得一致的结果。

0
0 Comments

在PostgreSQL中,可以使用当前的UTC时间作为默认值。原因是,有时我们需要在数据库中存储UTC时间,而不是本地时间。下面是一个解决该问题的示例代码:

create temporary table test(
    id int, 
    ts timestamp without time zone default (now() at time zone 'utc')
);

上述代码中,我们在默认值表达式周围加上了括号,以确保默认值是一个正确的UTC时间。

另外,我们还可以使用名为`now_utc()`的函数来简化查询操作。这个函数可以在查询中使用,而不是在表定义中使用默认值。

如果时间发生了调整,即时间向后调整了一个小时,上述代码仍然可以正常工作。因为`now()`返回的时间戳会自动考虑到与UTC的偏移量。

需要注意的是,在PostgreSQL 11.5中,运行以下代码会导致错误:

ALTER TABLE testcase_result ADD COLUMN date_created TIMESTAMP WITHOUT TIME ZONE DEFAULT (NOW() AT TIME ZONE "UTC") NOT NULL;

错误信息为:ERROR: column "UTC" does not exist。这是因为在代码中使用了双引号而不是单引号,正确的写法应该是使用单引号,并且将`'utc'`字符串全部小写。

如果需要在当前时间上添加一定的时间间隔作为默认值,可以使用以下代码:

timestamp without time zone default ((now() + '5 days') at time zone 'utc')

通过上述方法,我们可以在PostgreSQL中使用当前的UTC时间作为默认值。这样可以确保在存储和操作时间数据时,始终使用统一的时间标准。

0