我正在尝试将 Postgres 数据库中的时间戳格式化为某种格式:
YYYY-MM-DD HH24:MI:SS
通过这样做:
update myTable set tds = to_char(tds, 'YYYY-MM-DD HH24:MI:SS')::timestamp;
我设法将之前存储的所有
tds
设置为这种格式。但是,任何新添加的条目都会返回:YYYY-MM-DD HH24:MI:SS.MS
,因为默认设置为 now()
。
如何更改此设置,以便新添加的条目也具有格式:
YYYY-MM-DD HH24:MI:SS
?
时间戳类型没有存储格式。您可以将其默认设置为创建时截断为秒的时间戳
create table t (
tds timestamp default date_trunc('second', now())
)
或更改表格
alter table t
alter column tds
set default date_trunc('second', now());
insert into t values (default);
INSERT 0 1
select * from t;
tds
---------------------
2014-03-11 19:24:11
如果您只是不想显示毫秒部分,请格式化输出
select to_char(now(), 'YYYY-MM-DD HH24:MI:SS');
to_char
---------------------
2014-03-11 19:39:40
timestamp
或 timestamptz
可以选择采用精度修饰符 p
:timestamp(p)
。now()::timestamp(0)
或:
now()::timestamptz(0)
CURRENT_TIMESTAMP
(返回 timestamptz
)或 LOCALTIMESTAMP
(返回 timestamp
)允许相同的精度修饰符:
CURRENT_TIMESTAMP(0)
LOCALTIMESTAMP(0)
这比调用
date_trunc()
要短一些 - 截断小数秒(可能是你真正想要的!)
date_trunc('second', now())
将时间戳存储为
timestamptz
(或 timestamp
),not 作为字符类型。
最后,为了确保...
新添加的条目也具有格式:YYYY-MM-DD HH24:MI:SS
您可以将您的列定义为类型
timestamptz(0)
。这涵盖了输入该列的所有值,而不仅仅是默认值。但舍入可能会在未来引入长达半秒的时间戳。如果这可能是一个问题,请使用 date_trunc()
。
请参阅 @Clodoaldo 的回答,了解有关
to_char()
以及如何 ALTER TABLE
的说明。
有关时间戳和时区处理的深入信息的相关答案: