我正在将带有时区的时间戳转换为ISO格式:

select to_char('2020-01-01T20:20:03.000000000Z'::timestamptz, 'YYYY-MM-DD"T"HH24:MI:SS.US"Z"');

在这种情况下,微秒都是零.如果时间戳中没有微秒,我如何在格式中指定不显示这些和前.

或者,有没有一种更好的方法完全用ISO格式的时区格式化时间戳?

推荐答案

to_char函数只需要一个格式参数,但根据微秒的值不同,您所要求的格式参数也不同.所以你不能直接这么做.但是,您可以使用case来 Select 适当的格式.这可以在case中作为第二个参数来完成.所以:(假设第ts栏)

select to_char(ts 
              ,case when mod(extract (microseconds from ts),1000000) = 0 
                    then 'YYYY-MM-DD"T"HH24:MI:SS"Z"'
                    else 'YYYY-MM-DD"T"HH24:MI:SS.US"Z"'
               end 
             ) "Timestamp"
  from <table_name>;

与将case作为参数放在to_char中相比,在case中使用to_char似乎更直观、更容易阅读:

select case when mod(extract (microseconds from ts),1000000) = 0 
            then to_char(ts,'YYYY-MM-DD"T"HH24:MI:SS"Z"')
            else to_char(ts,'YYYY-MM-DD"T"HH24:MI:SS.US"Z"')
       end "Timestamp"
  from <table_name>;

请参见demo here.另请参阅extract()函数的文档.

Postgresql相关问答推荐

此PostgreSQL汇总分组不适用于窗口表达式

为什么在PostgreSQL中CPU_INDEX_TUPLE_COST与CPU_TUPLE_COST不同

在同一 Select 列表中两次使用jsonb_arrayElements()是否安全?

ANTLR4 PostgreSQL语法被 destruct 了吗?

我可以将jsonb_set与来自SELECT语句的新值(第三个参数)一起使用吗?

Postgres如何插入带有十进制逗号的实数?

select语句的Jooq代码生成

为什么不能超过 10 个并发连接到 Postgres RDS 数据库

PostgreSQL 中的复制槽是否会阻止删除 WALL,即使它们来自另一个数据库?

PostgreSQL - 我应该如何使用 first_value()?

消除 PostgreSQL SELECT 语句中的重复行

PostgreSQL 输入结束时的语法错误

处理 sqlalchemy 断开连接的更好方法

遇到序列化失败的条件是什么?

Rails 3:在 Postgres 支持的 ActiveRecord 中使用 json 作为列类型时出现迁移错误

如果 Column1 不为空,则按 Column1 排序,否则按 Column2 排序

如何使用字符串作为 PostgreSQL 咨询锁的键?

避免 created_at 和 updated_at 由 sequelize 自动生成

如何为查询执行设置语句超时

基于秒的 Postgresql 日期差异