Извлечь дату из даты и времени и рассчитать общее количество минут из продолжительности - PullRequest
0 голосов
/ 16 мая 2018

У меня есть таблица в 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 должны содержать только часть mm/dd/yyyy из start_time иend_time соответственно.

duration_minutes следует рассчитать общую продолжительность в минутах (например, если продолжительность 1:02:54, продолжительность в минутах должна быть 62, что составляет 60 + 2)

Как я могу сделать это с помощью SQL?

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Исходя из ввода 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;

Основные баллы:

  • Для начала используйте timestamp и interval вместо varchar.
    Или не храните функционально зависимый столбец duration вообще. Это может быть дешево вычислено на лету.

  • Для дисплей / a конкретное текстовое представление использование to_char().
    Будьте явными и не полагайтесь на настройки локали, которые могут меняться от сессии к сессии.
    Модификатор FM предназначен для ( цитирует руководство ):

    режим заполнения (подавление начальных нулей и пробелов)

  • extract (epoch FROM interval_tpe) производит количество содержащихся секунд. Вы хотите урезать дробные минуты? Целочисленное деление делает именно это, поэтому приведение к int, как показано. Связанный:

0 голосов
/ 16 мая 2018

Похоже, что вы делаете следующее:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...