it-swarm.asia

كيفية الحصول على عمود الطابع الزمني بالمللي ثانية فقط من PostgreSQL؟

لدي عمود "تم إنشاؤه" بالنوع 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
31
Jonas

استخدم 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;
37
DrColossos

--تعديل--

لقد اكتشفت أن هذا (انظر أدناه) خطأ في الأساس. انظر كيف أحصل على الطابع الزمني الحالي ليونيكس من PostgreSQL؟ لمصدر ارتباك ...

- نهاية التحرير--

النشر كإجابة لأنه لن يعمل كتعليق.

اختبار:

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 في الاستعلام الثالث: 1305638328.03266 - 3600 مختلفة.

6
Jack says try topanswers.xyz