web-dev-qa-db-fra.com

Convertir la date en horodatage Unix dans PostgreSQL

J'ai une table avec une colonne abc portant l'horodatage unix (par exemple 13898161481435) et je veux exécuter une sélection entre les dates.

Il ne serait pas efficace de faire un

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

qui convertirait chaque enregistrement.

Faites plutôt quelque chose comme
où abc> ('14/01/2014 00:00:00 'tobigint ()) et abc <...

Mais je ne peux pas trouver de référence, cependant pour le cas inverse.

15
javadude

Essaye ça

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

Documents PostgreSQL

21
Vignesh Kumar A

Vous n'avez pas besoin de le convertir en char pour le comparer.

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

Je ne pense pas que la conversion serait très inefficace car les horodatages sont stockés en interne dans un format similaire à Epoch secs (certes avec une origine et une résolution différentes).

Si vous voulez vraiment aller dans l'autre sens:

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

Observation intéressante cependant,

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';

prend près de 10 secondes (mon db avec 1,5 mill record), le dessous seulement 1,5 sec

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));

et ci-dessous environ 1sec

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);

compter environ 40 000 enregistrements

Probablement parce que je dirais la division.

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