如何从`yyyy/mm/dd hh:mm:ss`中提取出`hh:mm:ss`

3
我有以下表格 时间戳(6)无时区
2000/01/01 0:00:00
2000/01/01 10:00:00
2000/01/01 04:00:00

我想要获取 hh:mm:ss 格式的时间。

我的期望结果如下:

0:00:00
10:00:00
04:00:00

有没有好的方法实现这个?


不确定这里发生了什么。这个问题明确要求删除日期部分并指定输出格式。它不是与链接的重复线程,我们也找不到那个线程中的答案。此外,这里有一个很好的答案,提出了 ::time,保留比 to_char() 更灵活的数据类型 - 只是不完美地将 ::time(0) 舍入为完美。 - Zegarek
col - trunc(col) 能用吗? - tnavidi
@tnavidi col - date_trunc('seconds',col) 将返回截断后的秒数,而不是没有秒数的时间。 - Zegarek
1个回答

4
  1. 如果只需要提取文本,可以使用to_char(col,'HH:MI:SS')函数。该函数具有很高的格式灵活性,并在秒后截断/丢弃所有内容,而不进行四舍五入。

  2. 要像所需的结果中一样删除前导零,可以在to_char()中所需的字段中添加FM fill mode修改器前缀

  3. col::time(0)也将保留time数据类型,从而使您可以使用适当的函数和运算符:

    time, timestampinterval接受可选精度值p,其指定在秒字段中保留的小数位数。默认情况下,没有对精度进行明确的界限。 p的允许范围为0到6。

    将其设置为0将四舍五入秒的小数部分。最初是由其他人提出的建议 - 在我看来是最好的选择 - 但当线程被错误地丢弃为重复项时,该答案被删除了。

  4. date_trunc()函数可以让您丢弃小数部分,同时保留适当的类型。

select now()::timestamp            as "now",
       to_char(now(),'HH:MI:SS')   as "to_char()",
       to_char(now(),'FMHH:MI:SS') as "fillmode", --trims one leading zero
       now()::time(0)              as "::time(0)",--rounds fractions
       date_trunc('seconds',now() )::time  as "date_trunc()";--discards fractions

/*          now             | to_char() | fillmode | ::time(0) | date_trunc()
----------------------------+-----------+----------+-----------+--------------
 2022-11-14 09:03:04.810214 | 09:03:04  | 9:03:04  | 09:03:05  | 09:03:04
(1 row)
*/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接