it-swarm-eu.dev

Jak získat sloupec časového razítka za pouhé milisekundy od PostgreSQL?

Mám sloupec „vytvořený“ s typem timestamp without time zone default now() v databázi PostgreSQL.

Pokud vyberu sloupce, bude ve výchozím nastavení pěkný a čitelný formát:

SELECT created FROM mytable;

         created
---------------------------
2011-05-17 10:40:28.876944

Chtěl bych však získat časové razítko pouze za milisekundy (jako dlouhé). Něco takového:

VYBRAT myformat (vytvořený) Z mytable;

     created
-----------------
2432432343876944

Jak mohu získat sloupec časového razítka za pouhé milisekundy od PostgreSQL?


Reakce na Jacka:

Mám stejný rozdíl jako vy (-3600), ale pokud použiji timestamp with time zone, Vidím, že „chyba“ nebo rozdíl je způsoben tím, že „1970-01-01“ získá časové pásmo +01.

create table my_table_2(created timestamp with time zone);
CREATE TABLE
insert into my_table_2 (created) values (now()), ('1970-01-01');
INSERT 0 2
select created, extract(Epoch from created) from my_table_2;
            created            |    date_part
-------------------------------+------------------
 2011-05-18 11:03:16.909338+02 | 1305709396.90934
 1970-01-01 00:00:00+01        |            -3600
(2 rows)

Je rozdíl chyba? Možná jsem v tuto chvíli kvůli „letnímu času“?


Také zajímavé při použití to_timestamp() k vložení časových razítek 0 a 1.

insert into my_table_2 (created) values (to_timestamp(0));
INSERT 0 1

insert into my_table_2 (created) values (to_timestamp(1));
INSERT 0 1
select created, extract(Epoch from created) from my_table_2;
            created            |    date_part
-------------------------------+------------------
 2011-05-18 11:03:16.909338+02 | 1305709396.90934
 1970-01-01 00:00:00+01        |            -3600
 1970-01-01 01:00:00+01        |                0
 1970-01-01 01:00:01+01        |                1
31
Jonas

Použijte EXTRACT a časové razítko UNIX

SELECT EXTRACT(Epoch FROM TIMESTAMP '2011-05-17 10:40:28.876944') * 1000;

dal bych

1305621628876,94

Vynásobte to 1000 a proměňte ji na milisekundy. Pak ji můžete převést na cokoli chcete ( desetinná by byla dobrá volba). Nezapomeňte mít na paměti časové pásmo. JackPDouglas má takový příklad ve svém odpověď . Zde je výňatek z jeho odpovědi (created je sloupec s časovým razítkem), který ukazuje, jak pracovat s časovými pásmy:

SELECT EXTRACT(Epoch FROM created AT TIME ZONE 'UTC') FROM my_table;
37
DrColossos

--UPRAVIT--

Zjistil jsem, že to (viz níže) je v podstatě špatné. Viz Jak získám aktuální unixové časové razítko z PostgreSQL? pro zdroj mého zmatku ...

--END EDIT--

Příspěvek jako odpověď, protože to nebude fungovat jako komentář.

testbed:

create role stack;
grant stack to dba;
create schema authorization stack;
set role stack;

create table my_table(created timestamp);
insert into my_table(created) values(now()),('1970-01-01');
\d my_table
              Table "stack.my_table"
 Column  |            Type             | Modifiers
---------+-----------------------------+-----------
 created | timestamp without time zone |

dotazy:

select created, extract(Epoch from created) from my_table;

          created          |    date_part
---------------------------+------------------
 2011-05-17 13:18:48.03266 | 1305634728.03266
 1970-01-01 00:00:00       |            -3600


select created, extract(Epoch from date_trunc('milliseconds', created)) 
from my_table;

          created          |    date_part
---------------------------+------------------
 2011-05-17 13:18:48.03266 | 1305634728.03266
 1970-01-01 00:00:00       |            -3600


select created, extract(Epoch from created at time zone 'UTC') from my_table;

          created          |    date_part
---------------------------+------------------
 2011-05-17 13:18:48.03266 | 1305638328.03266
 1970-01-01 00:00:00       |                0

poznámka date_part ve třetím dotazu je: 1305638328,03266 - 3600 různých.