【问题标题】:Default timestamp format and fractional seconds默认时间戳格式和小数秒
【发布时间】:2014-03-11 17:40:30
【问题描述】:

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

【问题讨论】:

  • 我看到你想截断毫秒部分?你可以通过使用触发器来做到这一点。
  • 你的表定义在哪里?我们需要看到它才能确定。 \d myTable 在 psql 中。

标签: postgresql datetime format timestamp default


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    timestamp or timestamptz 类型可以选择使用精度修饰符ptimestamp(p)
    舍入到整秒,请将默认设置为:

    now()::timestamp(0)` or `now()::timestamptz(0)
    

    标准 SQL 函数 CURRENT_TIMESTAMP(返回 timestamptz)或 LOCALTIMESTAMP(返回 timestamp)允许使用相同的精度修饰符:

    CURRENT_TIMESTAMP(0)
    LOCALTIMESTAMP(0)
    

    这比调用date_trunc() 更便宜更短 - 截断小数秒(可能是你真正想要的!)

    将时间戳存储为timestamptz(或timestamp),使用字符类型。

    最后,要确定 ...

    新添加的条目也有格式:YYYY-MM-DD HH24:MI:SS

    您可以将您的列定义为类型timestamptz(0)。这不仅包括默认值,还包括输入到该列的所有值。

    有关to_char() 的说明以及如何使用ALTER TABLE,请参阅@Clodoaldo's answer

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

    【讨论】:

      猜你喜欢
      • 2021-01-16
      • 2011-11-01
      • 1970-01-01
      • 2018-12-07
      • 2013-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多