Преобразовать поля в метку времени для сравнения - PullRequest
0 голосов
/ 05 июля 2010

У меня есть база данных 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 ) 

Ответы [ 3 ]

1 голос
/ 29 апреля 2014

Типовые значения - это текстовые представления для 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');

Но это вряд ли имеет какой-либо смысл ...

0 голосов
/ 16 ноября 2010

Вы можете просто разыграть их:

select dateintext1::timestamp - dateintext2::timestamp from ...

Обратите внимание, что вы можете привести к времени, дате, отметке времени и т. Д., Если формат в поле правильный.

Гораздо лучше преобразовать текстовые поля в поля даты, времени или отметки времени.

alter table abc alter column texttime type timestamp using (texttime::timestamp);
0 голосов
/ 05 июля 2010

Вы должны дать, по крайней мере, один день, например ::1001

select EXTRACT(EPOCH FROM '2010-07-05 20:38:18'::timestamptz);

дает

 date_part
------------
 1278358698
...