Как я могу добавить два часа к значению метки времени, а затем преобразовать его в строку, содержащую только часы и минуты? - PullRequest
0 голосов
/ 02 марта 2020

Я пытаюсь обновить внесенное недавно изменение в значение в таблице, где я беру время показа определенного mov ie (который хранится в виде строки), затем добавляю к нему два часа и затем сохраните это новое значение в столбце времени показа другого mov ie (т. е. если время показа Iron Man 2 равно 18:45, я хочу установить время показа Iron Man 3 как 20:45).

Сначала я установил время показа, выполнив следующий запрос:

UPDATE movies 
SET show_time= 
    (TO_TIMESTAMP((SELECT show_time 
    FROM movies 
    WHERE title= 'Iron Man 2'), 'HH24:MI') + (2||'HOURS')::interval)
WHERE title='Iron Man 3'

Этот запрос получает значение времени показа Iron Man 2, преобразует его из строки в метку времени, а затем добавляет два часа к этому. Что якобы работало, пока я не посмотрел на значение, сохраненное для времени показа для Iron Man 3:

id  title       year    show_time
3   Iron Man 2  2010    18:45
7   Iron Man 3  2013    0001-01-01 20:45:00-00:01:15 BC

Я хочу попробовать изменить значение времени показа, чтобы оно имело только формат ЧЧ: ММ. Я попытался сделать это с помощью следующего запроса:

   UPDATE movies
   SET show_time = 
       (TO_CHAR((SELECT show_time 
        FROM movies 
        WHERE title= 'Iron Man 3'), 'HH24:MI')
   WHERE title= 'Iron Man 3'

Но я получаю сообщение об ошибке:

ERROR:  syntax error at or near "WHERE"

Я пытался настроить код, но не могу заставить его работать как целое. Есть предложения?

Ответы [ 2 ]

1 голос
/ 03 марта 2020

Вы можете упростить расчет времени, не нужно преобразовывать его в метку времени.

Вы можете добавить interval к значению time без промежуточного шага, поэтому вам просто нужно для приведения вашего show_time столбца к значению time (при условии, что это сохраняется как hh24:mi)

UPDATE movies
    SET show_time = (select to_char(show_time::time + interval '2 hours', 'hh24:mi') 
                     from movies
                     where title = 'Iron Man 2')
WHERE title='Iron Man 3';

Другим вариантом будет объединение:

update movies m1
  set show_time = to_char(m2.show_time::time + interval '2 hour', 'hh24:mi')
from movies m2
where m1.title = 'Iron Man 3'
  and m2.title = 'Iron Man 2';

Обратите внимание, что этот подход завершится неудачно, если результирующая среда выполнения обернется в полночь.

Онлайн-пример


Поскольку show_time хранит значение времени, вы должны изменить этот столбец на правильный тип данных:

alter table movies
  alter column show_time type time using show_time::time;

После того как вы это сделали, вам больше не нужны приведения (show_time::time).

0 голосов
/ 02 марта 2020

Если столбец show_time имеет значение VARCHAR, вам необходимо преобразовать его в TIMESTAMP и после преобразования снова в Formated VARCHAR. Что-то вроде:

UPDATE movies SET show_time = TO_CHAR(TO_TIMESTAMP(show_time, 'DD-MON-RR HH:MI:SS.FF AM'), 'HH24:MI') WHERE title= 'Iron Man 3'

Но, в вашем случае, ошибка в том, что отсутствует символ ")"

...