我有一个表在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实现这一点?
2条答案
按热度按时间3hvapo4f1#
基于
varchar
输入,此查询生成所需的结果,确切地说:要点:
timestamp
和interval
代替varchar
开始。或者根本不“存储”函数相关列
duration
,它可以廉价地在运行中计算。to_char()
**。请明确说明,不要依赖于可能随会话而变化的区域设置。
FM
花样修改器用于(引用手册):填充模式(取消前导零和填充空白)
extract (epoch FROM interval_tpe)
生成包含的秒数。您想要截断分钟的小数部分吗?整数除法可以完成此操作,因此请像演示的那样强制转换为int
。pqwbnv8z2#
以下程序似乎可以满足您的需要:
如果希望日期采用特定格式,则使用
to_char()
。