পোস্টগ্র্রেএসকিউএল থেকে আমি কীভাবে বর্তমান ইউনিক্স টাইমস্ট্যাম্প পাব?


91

ইউনিক্স টাইমস্ট্যাম্পটি 1 ই জানুয়ারি, 1970 এর মধ্যরাত ইউটিসি থেকে সেকেন্ডের সংখ্যা।

পোস্টগ্র্রেএসকিউএল থেকে আমি কীভাবে সঠিক ইউনিক্স টাইমস্ট্যাম্প পাব?

কারেন্টটাইমস্ট্যাম্প ডট কম এবং টাইমস্ট্যাম্পে ১.৫ বি.ডি এর সাথে তুলনা করার সময় পোস্টগ্র্রেএসকিউএল থেকে আমি প্রত্যাশিত সময় পাই না:

এটি সঠিক টাইমস্ট্যাম্পটি দেয়:

SELECT extract(epoch from now());

যদিও এটি করে না:

SELECT extract(epoch from now() at time zone 'utc');

আমি টাইম জোনে ইউটিসি +02 এ থাকি। পোস্টগ্র্রেএসকিউএল থেকে বর্তমান ইউনিক্স টাইমস্ট্যাম্প পাওয়ার সঠিক উপায় কী?

এটি সঠিক সময় এবং সময় অঞ্চলটি প্রদান করে:

SELECT now();
              now
-------------------------------
 2011-05-18 10:34:10.820464+02

আরেকটি তুলনা:

select now(), 
extract(epoch from now()), 
extract(epoch from now() at time zone 'utc');
              now              |    date_part     |    date_part
-------------------------------+------------------+------------------
 2011-05-18 10:38:16.439332+02 | 1305707896.43933 | 1305700696.43933
(1 row)

Unix timestamp from the web sites:
1305707967

উত্তর:


82

পোস্টগ্রিতে, timestamp with time zoneসংক্ষেপে timestamptzএবং timestamp without time zoneহিসাবে সংক্ষিপ্ত করা যেতে পারে timestamp। আমি সরলতার জন্য সংক্ষিপ্ত প্রকারের নামগুলি ব্যবহার করব।

ইউনিক্স টাইমস্ট্যাম্পের timestamptzমতো পোস্টগ্রিজের কাছ থেকে now()পাওয়া সহজ, যেমনটি আপনি বলেছেন ঠিক:

select extract(epoch from now());

এগুলি timestamptzসহ যেকোন ধরণের থেকে নিখুঁত সময় পাওয়ার বিষয়ে আপনার যা জানা দরকার তা হ'ল now()

আপনার যদি timestampক্ষেত্র থাকে তখন বিষয়গুলি জটিল হয়ে যায় ।

আপনি যখন সেই ক্ষেত্রের timestamptzমতো ডেটা রাখবেন now(), এটি প্রথমে একটি নির্দিষ্ট টাইমজোনতে রূপান্তরিত হবে (হয় স্পষ্টভাবে at time zoneবা সেশন টাইমজোন রূপান্তর করে) এবং সময় অঞ্চল তথ্য বাতিল করা হয় । এটি আর কোনও পরম সময়কে বোঝায় না। এ কারণেই আপনি সাধারণত টাইমস্ট্যাম্পগুলি সংরক্ষণ করতে চান না timestampএবং সাধারণত ব্যবহার করতে চান timestamptz- সম্ভবত কোনও টাইমজোন একটি নির্দিষ্ট তারিখে সন্ধ্যা at টায় একটি চলচ্চিত্র প্রকাশিত হয় , এটি ব্যবহারের ক্ষেত্রে।

আপনি যদি কেবলমাত্র একক সময় জোনে কাজ করেন তবে আপনি (ভুল) ব্যবহার করে পালিয়ে যেতে পারেন timestamp। রূপান্তরটি timestamptzডিএসটি মোকাবেলা করার জন্য যথেষ্ট চালাক এবং রূপান্তরকরণের জন্য বর্তমান সময় অঞ্চলে থাকার জন্য টাইমস্ট্যাম্পগুলি ধরে নেওয়া হয়। জিএমটি / বিএসটি-র জন্য এখানে একটি উদাহরণ রয়েছে:

select '2011-03-27 00:59:00.0+00'::timestamptz::timestamp::timestamptz
     , '2011-03-27 01:00:00.0+00'::timestamptz::timestamp::timestamptz;

/*
|timestamptz           |timestamptz           |
|:---------------------|:---------------------|
|2011-03-27 00:59:00+00|2011-03-27 02:00:00+01|
*/

DBFiddle

তবে, নিম্নলিখিত বিভ্রান্তিকর আচরণটি নোট করুন:

set timezone to 0;

values(1, '1970-01-01 00:00:00+00'::timestamp::timestamptz)
    , (2, '1970-01-01 00:00:00+02'::timestamp::timestamptz);

/*
|column1|column2               |
|------:|:---------------------|
|      1|1970-01-01 00:00:00+00|
|      2|1970-01-01 00:00:00+00|
*/

DBFiddle

এটি কারণ :

পোস্টগ্রাইএসকিউএল কখনই আক্ষরিক স্ট্রিংয়ের বিষয়বস্তু তার ধরণ নির্ধারণের আগে পরীক্ষা করে না এবং তাই উভয়কে […] টাইম জ্যাম ছাড়াই টাইমস্ট্যাম্প হিসাবে বিবেচনা করবে। আক্ষরিককে টাইম জোনের সাথে টাইমস্ট্যাম্প হিসাবে বিবেচনা করা হয় তা নিশ্চিত করার জন্য, এটিকে সঠিক স্পষ্ট ধরণ দিন ... একটি আক্ষরিক যা টাইম জোন ছাড়াই টাইমস্ট্যাম্প হিসাবে নির্ধারিত হয়েছে, পোস্টগ্র্যাস এসকিউএল নিঃশব্দে কোনও সময় অঞ্চল ইঙ্গিত উপেক্ষা করবে


দশমিক বিন্দু ব্যতীত ফলাফল দশমিককে পূর্ণসংখ্যায় রূপান্তর করার কোনও ধারণা (আমি সংখ্যাটি এবং দশমিককে এক বৃহত পূর্ণসংখ্যার হিসাবে মার্জ করার অর্থ)। ধন্যবাদ।
WM

ভালো লেগেছে এই কিন্তু আমি নিশ্চিত করুন যে আপনি না সত্যিই যে কাজ করতে চান আছি। সম্ভবত আপনি দশটি দ্বারা গুন করতে এবং কোনও দশমিক দশমিক দুটি ছাঁটাই করতে চান?
জ্যাক ডগলাস

2
@WM সম্ভবত এই মত? SELECT FLOOR(EXTRACT(epoch FROM NOW())*1000);
জো 23

21
SELECT extract(epoch from now() at time zone 'utc');

সঠিক টাইমস্ট্যাম্পটি ফেরত দেয় না কারণ পোস্টগ্রিজ টাইমজোন রূপান্তর ফলাফল থেকে সময় অঞ্চল তথ্য দূরে সরিয়ে দেয়:

9.9.3। টাইম জোনে

সিনট্যাক্স: টাইম জোন ছাড়াই টাইমস্ট্যাম্প এ টাইম জোন জোন
রিটার্নস: টাইম জোন সহ টাইমস্ট্যাম্প
নির্দিষ্ট সময় অঞ্চলে অবস্থিত সময় অঞ্চল ছাড়াই প্রদত্ত টাইম স্ট্যাম্পটিকে ট্রিট করে

সিনট্যাক্স: টাইম জোনের সাথে টাইমস্ট্যাম্প এ টাইম জোন জোন
রিটার্নস: টাইমস্ট্যাম্প ছাড়াই টাইমস্ট্যাম্প সময়
টাইম স্ট্যাম্পকে টাইম জোনের সাথে নতুন সময় অঞ্চলে রূপান্তর করুন, কোনও সময় অঞ্চল নির্ধারণ ছাড়াই

এরপরে, এক্সট্রাক্টটি সময় অঞ্চল ছাড়াই টাইমস্ট্যাম্পের দিকে নজর দেয় এবং এটিকে স্থানীয় সময় হিসাবে বিবেচনা করে (যদিও এটি ইতিমধ্যে বাস্তবে প্রকৃতপক্ষে)।

সঠিক উপায়টি হ'ল:

select now(),
       extract(epoch from now()),                                          -- correct
       extract(epoch from now() at time zone 'utc'),                       -- incorrect
       extract(epoch from now() at time zone 'utc' at time zone 'utc');    -- correct

          now                  |    date_part     |    date_part     |    date_part
-------------------------------+------------------+------------------+------------------
 2014-10-14 10:19:23.726908+02 | 1413274763.72691 | 1413267563.72691 | 1413274763.72691
(1 row)

শেষ লাইনে প্রথম at time zoneরূপান্তর সম্পাদন করে, দ্বিতীয়টি ফলাফলকে নতুন সময় অঞ্চল নির্ধারণ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.