【问题标题】:postgres time conversion hh:mm:ss.us to hh:mmpostgres 时间转换 hh:mm:ss.us 到 hh:mm
【发布时间】:2018-12-03 12:10:46
【问题描述】:

在我的考勤应用程序中使用 PostgreSQL 数据库。

我有一张包含进出时间的表格(hh:mm:ss.us 格式)。

当我减去时间 (OUT -IN) 来计算工作时间时,由于精度,结果与预期不符。

如果 IN 时间是“22:12:56.09” & OUT TIME 是“22:14:06.06”,仅考虑 HH:mm 的差异应该是 00:02,但它实际上显示“00:01:09.97”在 Excel 中变为“00:01”,仅使用 HH:mm。

我正在尝试将时间从 hh:mm:ss.us 转换为 hh:mm(时间格式),以便我可以减去时间并获得所需的输出。

我在 SQL Server 中做过类似的事情,但在 PostgreSQL 中没有找到任何函数。请指教。

【问题讨论】:

  • 这些列是什么数据类型? time 列没有“格式”,您可以使用to_char() 以您想要的任何格式显示它们。从您的描述看来,您似乎真的想要一个interval,它是一个持续时间而不是time(它代表一个时间点,不是以分钟和秒为单位的持续时间)跨度>
  • 使用(p) 设置“精度”,如此处所述。 postgresql.org/docs/9.6/static/datatype-datetime.html

标签: postgresql datetime time


【解决方案1】:

首先,您需要截断秒数。然后减去得到想要的结果

选择

to_char(
  (
    to_char('22:14:06.06' :: time, 'HH24:MI'):: time - 
    to_char('22:12:56.09' :: time, 'HH24:MI'):: time
  ),
  'HH24:MI'
)

结果:00:02

一般解决方案:

select
  to_char(
  (
    to_char(out, 'HH24:MI'):: time - to_char(in, 'HH24:MI'):: time
  ),
  'HH24:MI'
)

这里 to_char() 的目的是将结果格式化为小时:分钟而不包括秒。 Postgres 默认在间隔中包含秒数。

【讨论】:

  • to_char('22:14:06.06' :: time, 'HH24:MI'):: time可以简化为time '22:14:06.06'
  • 但是我们需要在减去之前截断秒数。格式为 'HH24:MI' 的 to_char() 用于截断 seonds。同样在减去 之后,结果将是类型间隔小时:分钟:秒(即 00:02:00)。但我们需要小时:分钟(即 00:02)。因此,间隔(出入)再次使用 to_char() 格式化,格式为 'HH24:MI'
【解决方案2】:

您可以使用带有时间戳的 date_trunc 函数。

它会像这样工作:
select date_trunc('minute', out) - date_trunc('minute', in)

这将在时间戳上设置分钟级精度并将 HH:mm:ss 转换为 HH:mm:00

【讨论】:

    猜你喜欢
    • 2021-01-25
    • 2018-06-07
    • 2019-07-07
    • 2014-10-06
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    • 2022-12-16
    • 1970-01-01
    相关资源
    最近更新 更多