我正在将带有时区的时间戳转换为ISO格式:
select to_char('2020-01-01T20:20:03.000000000Z'::timestamptz, 'YYYY-MM-DD"T"HH24:MI:SS.US"Z"');
在这种情况下,微秒都是零.如果时间戳中没有微秒,我如何在格式中指定不显示这些和前.
?
或者,有没有一种更好的方法完全用ISO格式的时区格式化时间戳?
我正在将带有时区的时间戳转换为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>;