প্রথমত, পোস্টগ্র্যাস এসকিউএলএর সময় পরিচালনা এবং পাটিগণিত চমত্কার এবং অপশন 3 সাধারণ ক্ষেত্রে ভাল। এটি অবশ্য সময় এবং সময় অঞ্চলগুলির একটি অসম্পূর্ণ দৃশ্য এবং পরিপূরক হতে পারে:
- ব্যবহারকারীর টাইম জোনের নাম ব্যবহারকারীর পছন্দ হিসাবে সংরক্ষণ করুন (যেমন
America/Los_Angeles
, না -0700
)।
- ব্যবহারকারীর ইভেন্ট / সময় ডেটা স্থানীয়ভাবে তাদের রেফারেন্সের ফ্রেমে জমা দেওয়া হয়েছে (সম্ভবত ইউটিসি থেকে অফসেট, যেমন
-0700
)।
- প্রয়োগে, সময়টি রূপান্তর করুন
UTC
এবং একটি TIMESTAMP WITH TIME ZONE
কলাম ব্যবহার করে সংরক্ষণ করুন ।
- রিটার্ন সময় স্থানীয়ভাবে কোনও ব্যবহারকারীর সময় অঞ্চলে অনুরোধ করে (যেমন রূপান্তরিত
UTC
হয় America/Los_Angeles
)।
- আপনার ডাটাবেস এর সেট
timezone
থেকে UTC
।
এই বিকল্পটি সর্বদা কার্যকর হয় না কারণ ব্যবহারকারীর সময় অঞ্চল পাওয়া শক্ত হতে পারে এবং তাই TIMESTAMP WITH TIME ZONE
লাইটওয়েট অ্যাপ্লিকেশনগুলির জন্য হেজ পরামর্শটি । এটি বলেছিল, আমাকে এই বিকল্প 4 এর কিছু পটভূমি দিক আরও বিশদভাবে ব্যাখ্যা করতে দিন।
অপশন 3 এর মতো, এর কারণ WITH TIME ZONE
হ'ল কারণ যে সময়ে কিছু ঘটেছিল তা সময়ের একটি পরম মুহূর্ত। WITHOUT TIME ZONE
একটি উৎপাদ আপেক্ষিক সময় অঞ্চল। কখনও, কখনও কখনও নিখুঁত এবং আপেক্ষিক TIMESTAMP গুলি মিশ্রিত করবেন না।
একটি প্রোগ্রাম্যাটিক এবং ধারাবাহিকতার দৃষ্টিকোণ থেকে, নিশ্চিত করুন যে সমস্ত গণনাগুলি ইউটিসিকে সময় অঞ্চল হিসাবে ব্যবহার করে তৈরি করা হয়েছে। এটি পোস্টগ্র্রেএসকিউএল প্রয়োজনীয়তা নয়, তবে অন্যান্য প্রোগ্রামিং ভাষা বা পরিবেশের সাথে সংহত করার ক্ষেত্রে এটি সহায়তা করে। CHECK
টাইম স্ট্যাম্প কলামটিতে লেখার টাইম জোন অফসেট রয়েছে 0
তা নিশ্চিত করার জন্য কলামটিতে একটি সেট তৈরি করা একটি প্রতিরক্ষামূলক অবস্থান যা কয়েকটি শ্রেণীর বাগগুলি প্রতিরোধ করে (যেমন স্ক্রিপ্ট কোনও ফাইলে ডেটা ফেলে দেয় এবং অন্য কোনও কিছু সময় ব্যবহার করে টাইম ডেটা বাছাই করে লেক্সিকাল সাজান)। আবার, পোস্টগ্রেএসকিউএল ডেটের গণনা সঠিকভাবে করতে বা টাইম জোনের মধ্যে রূপান্তর করার জন্য প্রয়োজন না (যেমন পোস্টগ্র্রেএসকিউএল কোনও দুটি স্বেচ্ছাসেবী সময় অঞ্চলগুলির মধ্যে সময়কে রূপান্তর করতে খুব পারদর্শী)। ডাটাবেসে প্রবেশ করা ডেটা শূন্যের অফসেট সহ সঞ্চিত থাকে তা নিশ্চিত করতে:
CREATE TABLE my_tbl (
my_timestamp TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
CHECK(EXTRACT(TIMEZONE FROM my_timestamp) = '0')
);
test=> SET timezone = 'America/Los_Angeles';
SET
test=> INSERT INTO my_tbl (my_timestamp) VALUES (NOW());
ERROR: new row for relation "my_tbl" violates check constraint "my_tbl_my_timestamp_check"
test=> SET timezone = 'UTC';
SET
test=> INSERT INTO my_tbl (my_timestamp) VALUES (NOW());
INSERT 0 1
এটি ১০০% নিখুঁত নয়, তবে এটি একটি শক্তিশালী পর্যায়ে এন্টি-ফুটসুটুটেশন পরিমাপ সরবরাহ করে যা নিশ্চিত করে যে ডেটা ইতিমধ্যে ইউটিসিতে রূপান্তরিত হয়েছে। এটি কীভাবে করা যায় সে সম্পর্কে প্রচুর মতামত রয়েছে তবে আমার অভিজ্ঞতা থেকে অনুশীলনে এটি সেরা।
ডাটাবেস টাইম জোন হ্যান্ডলিংয়ের সমালোচনাগুলি মূলত ন্যায়সঙ্গত হয় (প্রচুর ডাটাবেস রয়েছে যা এটি দুর্দান্ত অক্ষমতার সাথে পরিচালনা করে) তবে পোস্টগ্রিসএসকিউএল টাইমস্ট্যাম্পগুলি এবং টাইমজোনগুলি পরিচালনা করা খুব দুর্দান্ত (এখানে এবং কিছু কয়েকটি "বৈশিষ্ট্য থাকা সত্ত্বেও)"। উদাহরণস্বরূপ, এই জাতীয় একটি বৈশিষ্ট্য:
-- Make sure we're all working off of the same local time zone
test=> SET timezone = 'America/Los_Angeles';
SET
test=> SELECT NOW();
now
-------------------------------
2011-05-27 15:47:58.138995-07
(1 row)
test=> SELECT NOW() AT TIME ZONE 'UTC';
timezone
----------------------------
2011-05-27 22:48:02.235541
(1 row)
নোট করুন যে AT TIME ZONE 'UTC'
টাইম জোন সম্পর্কিত তথ্যগুলি স্ট্রিপ করে এবং TIMESTAMP WITHOUT TIME ZONE
আপনার টার্গেটের রেফারেন্সের ফ্রেম ( UTC
) ব্যবহার করে একটি আপেক্ষিক তৈরি করে ।
কোনও অসম্পূর্ণ থেকে একটিতে রূপান্তরিত TIMESTAMP WITHOUT TIME ZONE
করার TIMESTAMP WITH TIME ZONE
সময়, অনুপস্থিত সময় অঞ্চলটি আপনার সংযোগ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত:
test=> SET timezone = 'America/Los_Angeles';
SET
test=> SELECT EXTRACT(TIMEZONE_HOUR FROM NOW());
date_part
-----------
-7
(1 row)
test=> SELECT EXTRACT(TIMEZONE_HOUR FROM TIMESTAMP WITH TIME ZONE '2011-05-27 22:48:02.235541');
date_part
-----------
-7
(1 row)
-- Now change to UTC
test=> SET timezone = 'UTC';
SET
-- Create an absolute time with timezone offset:
test=> SELECT NOW();
now
-------------------------------
2011-05-27 22:48:40.540119+00
(1 row)
-- Creates a relative time in a given frame of reference (i.e. no offset)
test=> SELECT NOW() AT TIME ZONE 'UTC';
timezone
----------------------------
2011-05-27 22:48:49.444446
(1 row)
test=> SELECT EXTRACT(TIMEZONE_HOUR FROM NOW());
date_part
-----------
0
(1 row)
test=> SELECT EXTRACT(TIMEZONE_HOUR FROM TIMESTAMP WITH TIME ZONE '2011-05-27 22:48:02.235541');
date_part
-----------
0
(1 row)
তলদেশের সরুরেখা:
- কোনও ব্যবহারকারীর সময় অঞ্চলটি নামযুক্ত লেবেল হিসাবে সংরক্ষণ করুন (উদাঃ
America/Los_Angeles
) এবং ইউটিসি থেকে অফসেট নয় (যেমন -0700
)
- কোনও শূন্য-অফসেট সংরক্ষণ করার জন্য যদি কোন বাধ্যতামূলক কারণ না থাকে তবে সমস্ত কিছুর জন্য ইউটিসি ব্যবহার করুন
- সমস্ত অ-শূন্য ইউটিসি বারকে ইনপুট ত্রুটি হিসাবে বিবেচনা করুন
- আপেক্ষিক এবং নিখুঁত টাইমস্ট্যাম্পগুলিকে কখনই মেশা এবং মেলানো হবে না
- সম্ভব হলে ডাটাবেস
UTC
হিসাবে ব্যবহার করুনtimezone
এলোমেলো প্রোগ্রামিং ভাষার নোট: পাইথনের datetime
ডেটা টাইপ পরম বনাম আপেক্ষিক সময়ের মধ্যে পার্থক্য বজায় রাখতে খুব ভাল (যদিও আপনি এটি পাইটিজেডের মতো লাইব্রেরির সাথে পরিপূরক না করা পর্যন্ত প্রথমে হতাশ হোন )।
সম্পাদনা
আমাকে তুলনামূলক বনাম পরমটির মধ্যে পার্থক্যটি আরও কিছুটা ব্যাখ্যা করতে দিন।
কোনও ইভেন্ট রেকর্ড করতে পরম সময় ব্যবহার করা হয়। উদাহরণস্বরূপ: "ব্যবহারকারী 123 লগ ইন করেছেন" বা "স্নাতক অনুষ্ঠানগুলি ২০১০-০৫-২০১৮ পিএসটি-তে শুরু হবে।" আপনার স্থানীয় সময় অঞ্চল নির্বিশেষে, আপনি যেখানে ঘটনাটি ঘটেছে সেখানে টেলিপোর্ট করতে পারলে, আপনি ইভেন্টটি ঘটবে তা প্রত্যক্ষ করতে পারবেন। একটি ডাটাবেসে বেশিরভাগ সময় ডেটা নিখুঁত হয় (এবং তাই TIMESTAMP WITH TIME ZONE
আদর্শভাবে একটি +0 অফসেট এবং নির্দিষ্ট টাইমজোন পরিচালনা করে এমন কোনও পাঠ্য লেবেল থাকা উচিত - অফসেট নয়)।
একটি আপেক্ষিক ইভেন্টটি হ'ল একটি নির্ধারিত সময় অঞ্চলের দৃষ্টিকোণ থেকে কোনও কিছুর সময় রেকর্ড করা বা সময় নির্ধারণ করা। উদাহরণস্বরূপ: "আমাদের ব্যবসায়ের দরজা সকাল ৮ টায় খোলা থাকে এবং রাত ৯ টায় বন্ধ হয়", "চলুন প্রতি সোমবার সকাল সাড়ে সাতটায় সাপ্তাহিক প্রাতঃরাশের বৈঠকের জন্য," বা "প্রতি হ্যালোইন রাত ৮ টায়।" সাধারণভাবে, ইভেন্টগুলির জন্য কোনও টেম্পলেট বা কারখানায় আপেক্ষিক সময় ব্যবহৃত হয় এবং প্রায় প্রতিটি কিছুর জন্য নিখুঁত সময় ব্যবহৃত হয়। এখানে একটি বিরল ব্যতিক্রম রয়েছে যা উল্লেখ করার মতো যা আপেক্ষিক সময়ের মান চিত্রিত করে। ভবিষ্যতের ইভেন্টগুলির জন্য যা ভবিষ্যতে যথেষ্ট পরিমাণে যেখানে নির্দিষ্ট কিছু ঘটতে পারে এমন সময় সম্পর্কে অনিশ্চয়তা থাকতে পারে, আপেক্ষিক টাইমস্ট্যাম্প ব্যবহার করুন। এখানে একটি বাস্তব বিশ্বের উদাহরণ:
ধরুন এটি ২০০৪ সাল এবং আপনার ২০০৩ সালের ৩১ শে অক্টোবর মার্কিন যুক্তরাষ্ট্রের পশ্চিম উপকূলে (অর্থাত্ ) America/Los_Angeles
/ বেলা একটায় প্রসবের সময়সূচি নির্ধারণ করা দরকার PST8PDT
। আপনি যদি নিখুঁত সময় ব্যবহার করে তা সঞ্চয় করে থাকেন ’2008-10-31 21:00:00.000000+00’::TIMESTAMP WITH TIME ZONE
তবে ডেলিভারিটি দুপুর ২ টা নাগাদ প্রদর্শিত হত কারণ মার্কিন সরকার ২০০৩ সালের এনার্জি পলিসি আইনটি পাস করেছে যা দিবালোকের সঞ্চয়ের সময় নিয়ন্ত্রণের নিয়মকে পরিবর্তন করেছিল changed ২০০৪ সালে যখন ডেলিভারিটি নির্ধারিত ছিল, তারিখটি 10-31-2008
প্যাসিফিক স্ট্যান্ডার্ড সময় ( +8000
) হত , তবে ২০০৫ সাল থেকে শুরু করে ++ টাইমজোন ডাটাবেসগুলি স্বীকৃত যে 10-31-2008
প্যাসিফিক ডাইটলাইট সেভিংস সময় হত (+0700
)। সময় অঞ্চলটির সাথে আপেক্ষিক টাইমস্ট্যাম্প সংরক্ষণের ফলে সঠিক প্রসবের সময়সূচী হত কারণ একটি আপেক্ষিক টাইমস্ট্যাম্প কংগ্রেসের অসতর্কিত ছন্দবদ্ধতার জন্য সুরক্ষিত। জিনিস নির্ধারণের জন্য আপেক্ষিক বনাম পরম সময় ব্যবহারের মধ্যে কাটফফ যেখানে একটি অস্পষ্ট লাইন, তবে আমার থাম্বের নিয়মটি হল যে ভবিষ্যতে 3-6 মিমি এর চেয়ে বেশি যে কোনও কিছুর জন্য সময়সূচী আপেক্ষিক টাইমস্ট্যাম্প ব্যবহার করা উচিত (নির্ধারিত = পরম বনাম পরিকল্পিত = আপেক্ষিক ???)।
অন্যান্য / শেষ প্রকারের আপেক্ষিক সময় হ'ল INTERVAL
। উদাহরণ: "কোনও ব্যবহারকারী লগ ইন করার 20 মিনিটের পরে সেশনটি শেষ হবে"। একটি INTERVAL
যথার্থ টাইমস্ট্যাম্প ( TIMESTAMP WITH TIME ZONE
) বা আপেক্ষিক টাইমস্ট্যাম্পস ( TIMESTAMP WITHOUT TIME ZONE
) এর সাথে সঠিকভাবে ব্যবহার করা যেতে পারে । এটি বলাও সমানভাবে সঠিক, "একটি ব্যবহারকারীর সেশনটি সফল লগইনের পরে 20 মিনিটের মেয়াদ শেষ করে (লগইন_ট্যাক + সেশন_দূতীকরণ)" বা "আমাদের সকালের প্রাতঃরাশের বৈঠকটি কেবল 60 মিনিট ধরে চলতে পারে (পুনরাবৃত্তি_ স্টার্ট_টাইম + সভা_ দৈর্ঘ্য)"।
বিভ্রান্তির শেষ বিট: DATE
, TIME
, TIME WITHOUT TIME ZONE
এবং TIME WITH TIME ZONE
সব আপেক্ষিক ধরনের তথ্য আছে। উদাহরণস্বরূপ: '2011-05-28'::DATE
একটি আপেক্ষিক তারিখ উপস্থাপন করে যেহেতু আপনার কাছে সময় অঞ্চল সম্পর্কিত কোনও তথ্য নেই যা মধ্যরাত শনাক্ত করতে ব্যবহৃত হতে পারে। একইভাবে, '23:23:59'::TIME
আপেক্ষিক কারণ আপনি সময় অঞ্চল বা DATE
সময় দ্বারা প্রতিনিধিত্ব করে না জানেন । এমনকি '23:59:59-07'::TIME WITH TIME ZONE
, আপনি জানেন না কী DATE
হবে। এবং সবশেষে, DATE
সময় অঞ্চলটি আসলে একটি নয় DATE
, এটি একটি TIMESTAMP WITH TIME ZONE
:
test=> SET timezone = 'America/Los_Angeles';
SET
test=> SELECT '2011-05-11'::DATE AT TIME ZONE 'UTC';
timezone
---------------------
2011-05-11 07:00:00
(1 row)
test=> SET timezone = 'UTC';
SET
test=> SELECT '2011-05-11'::DATE AT TIME ZONE 'UTC';
timezone
---------------------
2011-05-11 00:00:00
(1 row)
ডাটাবেসগুলিতে তারিখ এবং সময় অঞ্চল স্থাপন একটি ভাল জিনিস, তবে সূক্ষ্মভাবে ভুল ফলাফল পাওয়া সহজ। সঠিকভাবে এবং সম্পূর্ণরূপে তথ্য সংরক্ষণ করার জন্য ন্যূনতম অতিরিক্ত প্রচেষ্টা প্রয়োজন, তবে এর অর্থ এই নয় যে অতিরিক্ত প্রচেষ্টা সর্বদা প্রয়োজন।