У меня есть база данных Postres и вы хотите сравнить два поля метки времени.
Основной запрос:
select t1.valu1, t1.valu2 from table1 as t1 where t1.valu1 == t1.valu2
При сравнении временной отметки:
select t1.valu1, t1.valu2 from table1 as t1
where EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE t1.valu1 )
== EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE t1.valu2 )
Пример значений valu1
:
'14:50:15'
, '10:50:15'
valu2
: '11:10:15'
, '17:50:15'
Я хочу преобразовать valu1
и valu2
в метки времени и сравнить их впоследствии.
// syntax of extract
EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE '20:38:18');
Я получаю сообщение об ошибке в следующем формате:
EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE t1.valu2 )
Ваши значения образцов представляют собой текстовые представления для time
не timestamp
:
'14:50:15', '10:50:15', '11:10:15', '17:50:15'
Предполагая text
как тип источника согласно более позднему комментарию.
Было бы разумно отбросить их вовремя, чтобы устранить незначительное пустое пространство или привести 0 к сравнению. Но для простого трансляции он должен быть действительным форматом времени:
SELECT valu1, valu2
FROM table1
WHERE valu1::time = valu2::time
Если вы действительно хотите сравнить "как временные метки", вам нужно будет использовать to_timestamp()
с соответствующим шаблоном формата:
SELECT valu1, valu2
FROM table1
WHERE to_timestamp(valu1, 'HH24:MI:SS')
= to_timestamp(valu2, 'HH24:MI:SS');
Но это вряд ли имеет смысл...
Вы можете просто бросить их:
select dateintext1::timestamp - dateintext2::timestamp from ...
Обратите внимание, что вы можете использовать время, дату, временную метку и т.д. Пока правильный формат в поле.
Намного лучше преобразовать текстовые поля в поля даты, времени или времени.
alter table abc alter column texttime type timestamp using (texttime::timestamp);
Вы должны дать, по крайней мере, день, например:
select EXTRACT(EPOCH FROM '2010-07-05 20:38:18'::timestamptz);
дает
date_part ------------ 1278358698