Làm cách nào để lấy cột dấu thời gian chỉ trong một phần nghìn giây từ PostgreSQL?


29

Tôi có một cột "được tạo" với loại timestamp without time zone default now()trong cơ sở dữ liệu PostgreSQL.

Nếu tôi chọn colums, nó có định dạng đẹp và dễ đọc theo mặc định:

SELECT created FROM mytable;

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

Nhưng tôi muốn có được dấu thời gian chỉ trong một phần nghìn giây (dưới dạng Dài). Một cái gì đó như thế này:

CHỌN myformat (đã tạo) TỪ mytable;

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

Làm cách nào tôi có thể lấy cột dấu thời gian chỉ trong một phần nghìn giây từ PostgreSQL?


Trả lời Jack:

Tôi nhận được sự khác biệt giống như bạn (-3600), nhưng nếu tôi sử dụng timestamp with time zonetôi có thể thấy rằng "lỗi" hoặc sự khác biệt là do '1970-01-01' có múi giờ +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)

Là sự khác biệt một lỗi? Tôi có thể là do "Thời gian tiết kiệm ánh sáng ban ngày" vào lúc này?


Cũng thú vị trong khi sử dụng to_timestamp()để chèn dấu thời gian 0 và 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

Câu trả lời:


35

Sử dụng EXTRACTvà Dấu thời gian UNIX

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

sẽ cho

1305621628876.94

Nhân nó 1000để biến nó thành mili giây. Sau đó, bạn có thể chuyển đổi nó thành bất cứ điều gì bạn muốn ( thập phân sẽ là một lựa chọn tốt). Đừng quên giữ múi giờ trong tâm trí. JackPDoureb có một ví dụ như vậy trong câu trả lời của mình . Đây là một đoạn trích từ câu trả lời của anh ấy ( createdlà cột với bảng thời gian của bạn) minh họa cách làm việc với các múi giờ:

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

5

--CHỈNH SỬA--

Tôi đã phát hiện ra điều này (xem bên dưới) về cơ bản là sai. Xem Làm thế nào để tôi có được dấu thời gian unix hiện tại từ PostgreSQL? cho nguồn gốc của sự nhầm lẫn của tôi ...

--END EDIT--

Đăng như một câu trả lời vì nó sẽ không hoạt động như một bình luận.

thử nghiệm:

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 |

truy vấn:

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

lưu ý date_parttrong truy vấn thứ ba là: 130563 83 28.03266 - 3600 khác nhau.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.