web-dev-qa-db-ja.com

postgresqlで日付をUNIXタイムスタンプに変換する

UNIXタイムスタンプ(例:13898161481435)を保持する列abcを持つテーブルがあり、日付間の選択を実行したいと思います。

を行うのは効率的ではありません

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

すべてのレコードを変換します。

むしろ次のようなことをする
where abc>('14/01/2014 00:00:00 'tobigint())およびabc <...

しかし、逆の場合については、参考文献を見つけることができません。

15
javadude

これを試して

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

PostgreSQLドキュメント

21
Vignesh Kumar A

比較するために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')
4
harmic

興味深い観察ですが、

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ミルのレコードがあります)。

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レコードをカウントする

おそらく私が言う分割のためです。

3
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))"

2

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))"
1
javadude