2014-02-01 3 views
9

У меня есть таблица с столбцом abc, несущим временную метку unix (например, 13898161481435), и я хочу запустить промежуток между датами.Преобразование даты в unix timestamp в postgresql

Было бы не эффективным, чтобы сделать

where TO_CHAR(TO_TIMESTAMP(abc/1000), 'DD/MM/YYYY') > '14/01/2014 00:00:00' and ..; 

, который будет конвертировать каждую запись.

Скорее сделать что-то вроде
где а> ('14/01/2014 00:00:00' tobigint()) и аЬса < ...

Но я не могу найти никаких ссылок, хотя для обратного случая.

ответ

4

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

WHERE to_timestamp(abc/1000) > timestamp '2014-01-28 00:00:00' 

Я не думаю, что преобразование было бы очень неэффективно, поскольку временные метки хранятся внутри в том же формате, эпохи секунд (правда, с различным происхождением и разрешением).

Если вы действительно хотите пойти другим путем:

WHERE abc > extract(epoch from timestamp '2014-01-28 00:00:00') 
2

Интересное наблюдение, хотя, в то время как

select count(*) from cb.logs where to_timestamp(timestmp/1000) > timestamp '2014-01-15 00:00:00' and to_timestamp(timestmp/1000) < timestamp '2014-01-15 23:59:59'; 

занимает почти 10 секунд (мой дб с 1,5 мельничных записей), ниже всего 1,5 сек

select count(*) from cb.logs where (timestmp > (select extract(epoch from timestamp '2014-01-15 00:00:00') * 1000) and timestmp < (select extract(epoch from timestamp '2014-01-15 23:59:59') * 1000)); 

и ниже около 1сек

select count(*) from cb.logs where (timestmp > extract(epoch from timestamp '2014-01-15 00:00:00') * 1000) and (timestmp < extract(epoch from timestamp '2014-01-15 23:59:59') * 1000); 

сосчитать ~ 40.000 записей

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

+0

Первый запрос не может использовать индекс, определенный на колонке 'timestmp', тогда как две другие банки. Проверьте план выполнения. –

+0

Я с лошадью. Нет никакой арифметической операции, которая могла бы сделать эту разницу. Было бы интересно увидеть «объяснить анализ» для этих случаев. – harmic

+1

см. Ниже, размещение в комментарии делает его нечитаемым. – javadude

1
select count(*) from cb.logs where to_timestamp(timestmp/1000) > timestamp '2014-01-15 00:00:00' and to_timestamp(timestmp/1000) < timestamp '2014-01-15 23:59:59'; 
8600ms 

"Aggregate (cost=225390.52..225390.53 rows=1 width=0)" 
" -> Seq Scan on logs (cost=0.00..225370.34 rows=8073 width=0)" 
"  Filter: ((to_timestamp(((timestmp/1000))::double precision) > '2014-01-15 00:00:00'::timestamp without time zone) AND (to_timestamp(((timestmp/1000))::double precision) < '2014-01-15 23:59:59'::timestamp without time zone))" 
select count(*) from cb.logs where (timestmp > (select extract(epoch from timestamp '2014-01-15 00:00:00') * 1000) and timestmp < (select extract(epoch from timestamp '2014-01-15 23:59:59') * 1000)); 
1199ms 
"Aggregate (cost=209245.94..209245.95 rows=1 width=0)" 
" InitPlan 1 (returns $0)" 
" -> Result (cost=0.00..0.01 rows=1 width=0)" 
" InitPlan 2 (returns $1)" 
" -> Result (cost=0.00..0.01 rows=1 width=0)" 
" -> Seq Scan on logs (cost=0.00..209225.74 rows=8073 width=0)" 
"  Filter: (((timestmp)::double precision > $0) AND ((timestmp)::double precision < $1))" 
Смежные вопросы