【发布时间】:2018-05-15 21:02:15
【问题描述】:
我在 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_time 和 end_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)
start 和end 只需分别包含start_time 和end_time 的mm/dd/yyyy 部分。
duration_minutes 应以分钟为单位计算总持续时间(例如,如果持续时间为 1:02:54,则持续时间以分钟为单位应为 62,即 60+2)
如何使用 SQL 来做到这一点?
【问题讨论】:
-
使用适当的数据类型。
varchar在这里不合适。 -
到底为什么要将时间戳存储为 varchar?这是一个非常糟糕的主意
-
@a_horse_with_no_name :我将其存储为日期时间
-
Postgres 中没有
datetime。timestamp或timestamptz。 stackoverflow.com/a/9576170/939860。而duration可能应该是类型interval。我们应该继续假设varchar输入还是timestamp/interval?您的结果中是否需要T和Z装饰器?这些在 ISO 格式中是可选的。
标签: sql postgresql datetime