默认时间戳格式和小数秒

问题描述 投票:0回答:2

我正在尝试将 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

postgresql datetime format timestamp default
2个回答
6
投票

时间戳类型没有存储格式。您可以将其默认设置为创建时截断为秒的时间戳

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

4
投票

类型

timestamp
timestamptz
可以选择采用精度修饰符
p
timestamp(p)

要将 round 转换为整秒,请将默认值设置为:

now()::timestamp(0)

或:

now()::timestamptz(0)

标准 SQL 函数

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
的说明。

有关时间戳和时区处理的深入信息的相关答案:

© www.soinside.com 2019 - 2024. All rights reserved.