【问题标题】:convert time to decimal data type in PostgreSQL在 PostgreSQL 中将时间转换为十进制数据类型
【发布时间】:2021-08-08 11:05:49
【问题描述】:

在 PostgreSQL / pgadmin 中 - 如何将时间戳 (HH:MM:SS) 转换为十进制,以便乘以 hourly_rate (XX.YY$) 并获得总费用?

在我的一生中,我在 Google 或这个论坛上找不到任何相当简单的解决方案。

难道这是不可能的吗?

【问题讨论】:

  • Postgres 时间戳也有一个日期组件。您可以在问题中添加示例数据吗?
  • 你确定你的意思不是time 类型吗?样本数据和期望的结果会澄清。
  • 您的要求没有意义,听起来您将日期/时间的概念与间隔或持续时间混淆了。
  • 我在原始帖子中添加了截图 sn-p。我需要从着陆时间中扣除起飞时间以获得总飞行时间,然后我需要乘以飞行小时成本。我希望这能更好地解释我的问题。谢谢
  • 请以文本的形式提供数据,切勿以屏幕截图的形式提供。理想情况下,从您的 Postgres 版本和表定义开始(CREATE TABLE 语句)。

标签: sql postgresql datetime sql-timestamp


【解决方案1】:

假设你没有穿越午夜:


select round((extract(epoch from '15:09:00'::time - '11:53:00'::time)/3600)::numeric, 2) AS duration;
 duration 
----------
     3.27


--Generic form 

select round((extract(epoch from lndg_final_time -  tkof_01_time)/3600)::numeric, 2) AS duration;

我个人会使用timestamp with time zone 作为字段。然后你就有了“锚定”的时间和更少的混乱,特别是如果你最终跨越了午夜和/或 DST 边界。您仍然会从最终时间戳中减去开始时间戳,以获得从中提取纪元的间隔。

【讨论】:

  • 加一个建议timestamptz
【解决方案2】:

将您的 HMS 转换为秒并乘以 (hourlyrate/3600.0)。 (未调试)使用EXTRACT

EXTRACT (EPOCH FROM timecolumn) * hourlyrate * (1.0/3600.0)

如果您的timecolumn 还包含日期信息,则此计算将产生大得离谱的数字,所以要小心。为获得最佳结果,请使用区间数据类型。

【讨论】:

  • 如果你做时间戳减法,例如ts_end - ts_begin,你会得到一个间隔,你可以从中提取纪元并避免大的秒值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
  • 2015-03-12
  • 1970-01-01
  • 2015-05-11
  • 2016-05-09
  • 2013-04-27
  • 2022-11-28
相关资源
最近更新 更多