【问题标题】:Time difference between two columns storing only time in SQLSQL中仅存储时间的两列之间的时间差
【发布时间】:2022-01-24 23:36:56
【问题描述】:

我有两列(session_starttime 和 session_endtime),其数据类型是文本。如图所示,存储的只是时间部分,没有日期。

我正在努力获得以秒为单位的会话持续时间。最终目标是获得每次会话的平均时间。

我尝试了下面的代码,但没有成功

select 
avg(datediff('second', session_endtime,session_starttime)) as Average_settlement_time
from user_sessions ```

错误

(psycopg2.errors.UndefinedFunction) 函数 datediff(unknown, text, text) 不存在 第 8 行:avg(datediff('second', session_endtime,session_starttime)) a...

提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。

【问题讨论】:

  • 标记垃圾邮件并不能帮助我们帮助您。标记您真正使用的RDBMS,并且该RDBMS。
  • 错误信息看起来像 PostgreSQL 之一。如果这是正确的,那么您必须在应用函数之前将字符串类型的时间值显式转换为 TIME 数据类型。 PS。在 PostgreSQL 中,函数 DATEDIFF() 根本不存在。减去然后将 INTERVAL 数据类型转换为秒。
  • 在 Postgres 中,您只需使用 session_endtime - session_starttime
  • 如果要存储时间,则应将该列转换为time 数据类型。
  • 会话可以从23:55:00 开始并在00:05:00 结束吗?一个会话可以持续超过 24 小时吗?

标签: sql postgresql


【解决方案1】:

PostgreSQL 没有datediff 函数。

您可以将两列显式转换为time,然后将它们相减,得到INTERVAL 结果:

SELECT session_endtime::TIME - session_starttime::TIME
FROM mytable
-- E.g. returns 0 years 0 mons 0 days 0 hours 1 mins 40.00 secs for the first row

如果您想要几秒钟而不是 INTERVAL,您可以从中提取 EPOCH:

SELECT EXTRACT(EPOCH FROM session_endtime::TIME - session_starttime::TIME)
FROM mytable
-- E.g. returns 100 for the first row

【讨论】:

    猜你喜欢
    • 2013-08-31
    • 1970-01-01
    • 2021-10-21
    • 2019-05-20
    • 2014-09-21
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    • 2021-10-18
    相关资源
    最近更新 更多