postgresql 从日期时间中提取日期并从持续时间中计算总分钟数

2j4z5cfb  于 2023-03-08  发布在  PostgreSQL
关注(0)|答案(2)|浏览(135)

我有一个表在Postgres如下:

| id | start_time               | end_time                 | duration |
|----|--------------------------|--------------------------|----------|
| 1  | 2018-05-11T00:00:20.631Z | 2018-05-11T01:03:14.496Z | 1:02:54  |
| 2  | 2018-05-11T00:00:04.877Z | 2018-05-11T00:00:14.641Z | 0:00:10  |
| 3  | 2018-05-11T01:03:28.063Z | 2018-05-11T01:04:36.410Z | 0:01:08  |
| 4  | 2018-05-11T00:00:20.631Z | 2018-05-11T02:03:14.496Z | 2:02:54  |

start_timeend_time存储为varchar。格式为'yyyy-mm-dd hh24:mi:ss.ms'(ISO格式)。
duration已计算为end_time - start_time。格式为hh:mi:ss
我需要结果表输出如下:

| id | start_time               | end_time                 | duration | start     | end       | duration_minutes |
|----|--------------------------|--------------------------|----------|-----------|-----------|------------------|
| 1  | 2018-05-11T00:00:20.631Z | 2018-05-11T01:03:14.496Z | 1:02:54  | 5/11/2018 | 5/11/2018 | 62               | -- (60+2)
| 2  | 2018-05-11T00:00:04.877Z | 2018-05-11T00:00:14.641Z | 0:00:10  | 5/11/2018 | 5/11/2018 | 0                |
| 3  | 2018-05-11T01:03:28.063Z | 2018-05-11T01:04:36.410Z | 0:01:08  | 5/11/2018 | 5/11/2018 | 1                |
| 4  | 2018-05-11T00:00:20.631Z | 2018-05-11T02:03:14.496Z | 2:02:54  | 5/11/2018 | 5/11/2018 | 122              | -- (2X60 +2)

startend需要分别仅包含start_timeend_timemm/dd/yyyy部分。
duration_minutes应计算总持续时间(分钟)(例如,如果持续时间为1:02:54,则持续时间(分钟)应为62,即60+2)
我如何使用SQL实现这一点?

3hvapo4f

3hvapo4f1#

基于varchar输入,此查询生成所需的结果,确切地说:

SELECT *
     , to_char(start_time::timestamp, 'FMMM/DD/YYYY') AS start
     , to_char(end_time::timestamp  , 'FMMM/DD/YYYY') AS end
     , extract(epoch FROM duration::interval)::int / 60 AS duration_minutes
FROM   tbl;

要点:

  • 使用timestampinterval代替varchar开始。

或者根本不“存储”函数相关列duration,它可以廉价地在运行中计算。

  • 对于 * 显示 * / a * 特定文本表示 ,请使用*to_char()**。

请明确说明,不要依赖于可能随会话而变化的区域设置。
FM花样修改器用于(引用手册):
填充模式(取消前导零和填充空白)

  • extract (epoch FROM interval_tpe)生成包含的秒数。您想要截断分钟的小数部分吗?整数除法可以完成此操作,因此请像演示的那样强制转换为int
  • 获取不同时区时间之间的分钟差异
pqwbnv8z

pqwbnv8z2#

以下程序似乎可以满足您的需要:

select v.starttime::timestamp::date, v.endtime::date,
       extract(epoch from v.endtime::timestamp - v.starttime::timestamp)/60
from (values ('2018-05-11T00:00:20.631Z', '2018-05-11T01:03:14.496Z')) v(starttime, endtime)

如果希望日期采用特定格式,则使用to_char()

相关问题