วิธีรับคอลัมน์เวลาประทับในเวลามิลลิวินาทีเท่านั้นจาก PostgreSQL


29

ฉันมีคอลัมน์ "สร้าง" พร้อมพิมพ์timestamp without time zone default now()ในฐานข้อมูล PostgreSQL

ถ้าฉันเลือก colums มันมีรูปแบบที่ดีและอ่านได้ตามค่าเริ่มต้น:

SELECT created FROM mytable;

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

แต่ฉันต้องการได้รับการประทับเวลาในมิลลิวินาทีเท่านั้น (นาน) บางสิ่งเช่นนี้

SELECT 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-Timestamp

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 แก้ไข -

การโพสต์เป็นคำตอบเพราะจะไม่สามารถแสดงความคิดเห็นได้

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 |

คำสั่ง:

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 ต่างกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.