Як отримати стовпчик часових позначок за кілька мілісекунд від PostgreSQL?


29

У мене стовпець "створений" з типом timestamp without time zone default now()у базі даних PostgreSQL.

Якщо я вибираю колони, вона має приємний і читабельний формат за замовчуванням:

SELECT created FROM mytable;

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

Але я хотів би отримати часову позначку лише в мілісекундах (як Довга). Щось на зразок цього:

ВИБІРАТИ myformat (створений) Із mytable;

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

Як я можу отримати від PostgreSQL стовпець часової позначки за декілька мілісекунд?


Відповідь Джека:

Я отримую таку ж різницю, що і ви (-3600), але якщо я використовую, timestamp with time zoneя можу побачити, що "помилка" або різниця полягає в тому, що "1970-01-01" отримує часовий пояс +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)

Чи є різниця помилка? Я можу бути через "літній час" на даний момент?


Також цікаво під час to_timestamp()вставки часових позначок 0 і 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

Відповіді:


35

Використання EXTRACTта UNIX-часова мітка

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

дав би

1305621628876.94

Помножте його, 1000щоб перетворити його на мілісекунди. Потім ви можете перетворити його на все, що завгодно ( десятковий варіант буде хорошим вибором). Не забудьте пам’ятати про часовий пояс. JackPDouglas має такий приклад у своїй відповіді . Ось уривок з його відповіді ( createdце стовпець із часовою позначкою), який ілюструє, як працювати з часовими поясами:

SELECT EXTRACT(EPOCH FROM created AT TIME ZONE 'UTC') FROM my_table;

5

--EDIT--

Я виявив це (див. Нижче) в основному неправильно. Див. Як я можу отримати поточну позначку часу Unix від PostgreSQL?для джерела моєї плутанини ...

--END EDIT--

Публікація як відповідь, оскільки вона не працюватиме як коментар.

тестова площадка:

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 |

запити:

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

Примітка date_partв третьому запиті: 130563 83 28.03266 - 3600 різних.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.