PostgreSQL - to_char for timestamp如果为零则不显示微秒

p8h8hvxi  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(127)

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

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

字符串
在这种情况下,微秒都是零。如果时间戳中没有微秒,我如何在格式中指定不显示这些和前导.
或者有没有更好的方法完全用ISO格式的时区来格式化时间戳?

1u4esq0p

1u4esq0p1#

to_char函数需要一个格式参数,但是你所要求的需要一个不同的,取决于微秒的值。所以你不能直接这样做。但是,你可以使用case来选择合适的格式。这可以在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()函数的文档。

相关问题