Zaman damgası sütunu PostgreSQL'den yalnızca milisaniye cinsinden nasıl alınır?


29

timestamp without time zone default now()Bir PostgreSQL veritabanında türüyle "oluşturulan" bir sütuna sahibim .

Sütunları seçersem, varsayılan başına hoş ve okunabilir bir biçime sahiptir:

SELECT created FROM mytable;

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

Ancak zaman damgasını sadece milisaniye cinsinden (Uzun Süren) almak istiyorum. Bunun gibi bir şey:

SELECT myformat (oluşturulan) from mytable;

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

Zaman damgası sütununu PostgreSQL'den yalnızca milisaniye cinsinden nasıl alabilirim?


Jack'e verilen cevap:

Sizinle aynı farkı görüyorum (-3600), fakat kullanırsam timestamp with time zone"hata" ya da farkın '1970-01-01' zaman dilimi almasından kaynaklandığını görebiliyorum +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)

Fark bir hata mıdır? Şu anda "Gün ışığından yararlanma saati" nedeniyle olabilir?


Ayrıca to_timestamp()0 ve 1 zaman damgası eklemek için kullanılırken ilginç .

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

Yanıtlar:


35

Kullanım EXTRACTve UNIX-Timestamp

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

verecek

1305621628876,94

1000Milisaniye çevirmek için çarpın . Daha sonra istediğiniz ne dönüştürebilirsiniz ( ondalık , iyi bir seçim olacaktır). Saat dilimini aklınızda tutmayı unutmayın. JackPDouglas onun böyle bir örnek vardır cevap . createdSaat dilimleriyle nasıl çalışılacağını gösteren cevabından bir alıntı ( zaman damganızın olduğu sütun olarak):

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

5

--DÜZENLE--

Bunu keşfettim (aşağıya bakınız) temelde yanlış. Bkz Ben PostgreSQL'den şimdiki unix zaman damgası nasıl alabilirim? kafa karışıklığımın kaynağı için ...

--END EDIT

Bir cevap olarak gönderme çünkü yorum olarak çalışmaz.

test yatağı

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 |

sorguları:

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üçüncü sorgudaki not : 130563 83 28.03266 - 3600 farklı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.