使用当前时间(UTC)作为PostgreSQL的默认值。
使用当前时间(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...
在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时间为基准的问题。
使用当前时间作为默认值时,需要考虑时区的问题。在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时间的默认值。这样可以确保在不同的时区中获得一致的结果。
在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时间作为默认值。这样可以确保在存储和操作时间数据时,始终使用统一的时间标准。