使用postgresql格式化时间戳和数字的两个问题
Posted
技术标签:
【中文标题】使用postgresql格式化时间戳和数字的两个问题【英文标题】:Two questions for formatting timestamp and number using postgresql 【发布时间】:2016-02-05 13:51:16 【问题描述】:我正在选择格式为“YYYY-MM-DD”的日期列。
我想将其转换为时间戳,使其为“YYYY-MM-DD HH:MM:SS:MS”
我尝试过:
select CAST(mycolumn as timestamp) from mytable;
但这导致格式为 YYYY-MM-DD HH:MM:SS
我也试过了
select TO_TIMESTAMP(mycolumn,YYYY-MM-DD HH:MM:SS:MS) from mytable;
但这也不起作用。我似乎无法弄清楚格式化它的正确方法。请注意,我只想要毫秒的第一个数字。
/////////////第二个问题
我也在尝试选择数字数据,这样就不会有任何尾随零。
例如,如果我在表中有值,例如 1、2.00、3.34、4.50。
我希望能够将这些值选择为 1、2、3.34、4.5。
我尝试使用 ::float,但偶尔会出现奇怪的输出。我也尝试了四舍五入功能,但是不知道我需要多少小数点,我怎么能正确使用它呢?
感谢您的帮助!
【问题讨论】:
只有在每个帖子中保留一个问题时才真正有效。 如果mycolumn
是date
列,那么在其上使用to_timestamp()
没有意义。要格式化日期(或时间戳),您必须使用to_char()
。 to_timestamp()
用于将字符串值convert 转换为timestamp
值,而不是反过来。
【参考方案1】:
不幸的是,to_timestamp()
和 to_char()
函数似乎并不完美。
如果找不到更好的方法,请使用以下解决方法:
with example_data(d) as (
values ('2016-02-02')
)
select d, d::timestamp || '.0' tstamp
from example_data;
d | tstamp
------------+-----------------------
2016-02-02 | 2016-02-02 00:00:00.0
(1 row)
create function my_to_char(numeric)
returns text language sql as $$
select case
when strpos($1::text, '.') = 0 then $1::text
else rtrim($1::text, '.0')
end
$$;
with example_data(n) as (
values (100), (2.00), (3.34), (4.50))
select n::text, my_to_char(n)
from example_data;
n | my_to_char
------+------------
100 | 100
2.00 | 2
3.34 | 3.34
4.50 | 4.5
(4 rows)
另请参阅:How to remove the dot in to_char if the number is an integer
【讨论】:
rtrim(v_numeric::text, '.0')
非常危险。前任它将500
转换为'5'
【参考方案2】:
SELECT to_char(current_timestamp, 'YYYY-MM-DD HH:MI:SS:MS');
打印
2016-02-05 03:21:18:346
【讨论】:
【参考方案3】:只添加::timestamp 没有时区
select mycolumn::timestamp without time zone from mytable;
【讨论】:
这导致了相同的 YYYY-MM-DD HH:MM:SS 格式。我需要 1 毫秒的位置。 请举个例子以上是关于使用postgresql格式化时间戳和数字的两个问题的主要内容,如果未能解决你的问题,请参考以下文章
postgresql数据库中判断是否是数字和日期时间格式函数