【问题标题】:Subtracting two times to get duration减去两次以获得持续时间
【发布时间】:2016-07-13 11:55:03
【问题描述】:

我正在尝试从到达时间中减去出发时间来获得旅行的持续时间。

到达/离开的格式为HH:MM。

我正在使用 postgresql,时间列只是说“字符串”来说明它们是如何定义的。一位朋友帮助我将它们转换为整数,但我仍然坚持这一点:

SELECT x, cast (table1.arrival as integer) - cast (table.1departure as integer), sum(y), count(*)
FROM table1 INNER JOIN table2
ON .....
GROUP BY .....
ORDER BY.... 

一位朋友告诉我这个,但我不完全确定他的意思:“不,您需要创建一个新变量只需几分钟。1:30 = 90 分钟。将其转换为整数然后计算。” 我该怎么做?

【问题讨论】:

  • This SO answer 可以稍作修改以适用于您的问题。
  • 这些列是如何定义的?作为varchars?
  • 你的RDBMS是Mysql吗?
  • 您应该始终为您正在使用的特定数据库 (DBMS) 添加一个标签,因为它们之间的功能和语法各不相同。

标签: sql postgresql datetime casting numeric


【解决方案1】:

如果该列确实是varchar(或text),那么您需要先将该列强制转换为适当的时间。

SELECT x, table1.arrival::time - table.1departure::time, sum(y), count(*)
FROM table1 INNER JOIN table2
ON .....
GROUP BY .....
ORDER BY.

如果存储在列中的时间不是以 24 小时格式正确格式化的时间(例如 22:40),上述操作将失败

time - time 的结果是interval。如果你想在几分钟内得到结果,你需要从区间中提取它们:

extract(epoch from table1.arrival::time - table.1departure::time) / 60 

extract(epoch ..) 返回间隔中的秒数,这就是为什么您需要将其除以 60 才能得到分钟。

但是,如果到达和离开时间不在同一天(例如出发时间为 23:25,到达时间为次日 07:23),则此方法将无法正常工作


不相关但:您应该从不在varchar 或text 列中存储日期、时间或时间戳。 始终使用正确的数据类型。

【讨论】:

  • 老兄....非常感谢。工作完美。是的,这些表不是我创建的,所以我无法解释为什么它们没有正确存储。
【解决方案2】:

如果您的 RDBMS 是 Mysql,您可以使用 MySQL DATEDIFF() 函数

例如:

SELECT DATEDIFF(arrivale,departure) AS DiffDate

我在这里假设到达和离开是在同一天。 到达和离开的 TimeDate 格式类似于 HH:MM。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-24
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多