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

时间:2018-05-15 21:02:15

标签: sql postgresql datetime

我在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只需要分别包含mm/dd/yyyystart_time的{​​{1}}部分。

end_time应以分钟为单位计算总持续时间(例如,如果持续时间为1:02:54,则以分钟为单位的持续时间应为62,即60 + 2)

如何使用SQL执行此操作?

2 个答案:

答案 0 :(得分:1)

基于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模式修饰符适用于(quoting the manual):

      

    填充模式(抑制前导零和填充空白)

  • extract (epoch FROM interval_tpe)生成包含的秒数。你想截断分数分钟?整数除法就是这样做的,所以转向int就好了。相关:

答案 1 :(得分:0)

以下似乎可以满足您的需求:

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()