পোস্টগ্রিসের কয়েকটি ধরণের টাইমস্ট্যাম্প রয়েছে:
টাইমজোন ছাড়াই টাইমস্ট্যাম্প - (ইউটিসি টাইমস্ট্যাম্পগুলি সংরক্ষণ করা ভাল) আপনি এটি বহুজাতিক ডাটাবেস স্টোরেজে খুঁজে পাবেন। এক্ষেত্রে ক্লায়েন্ট প্রতিটি দেশের জন্য টাইমজোন অফসেটের যত্ন নেবে।
টাইমজোন সহ টাইমস্ট্যাম্প - টাইমস্টোন অফসেট ইতিমধ্যে টাইমস্ট্যাম্পের অন্তর্ভুক্ত।
কিছু ক্ষেত্রে, আপনার ডাটাবেস সময় অঞ্চল ব্যবহার করে না তবে আপনার এখনও স্থানীয় সময় অঞ্চল এবং দিবালোক সংরক্ষণের সময় বিবেচনা করে রেকর্ডগুলি গ্রুপ করতে হবে (যেমন https://www.timeanddate.com/time/zone/romania/bucharest )
টাইমজোন যুক্ত করতে আপনি এই উদাহরণটি ব্যবহার করতে পারেন এবং আপনার সাথে অফসেট টাইমজোনটি প্রতিস্থাপন করতে পারেন।
"your_date_column" at time zone '+03'
ডিএসটি নির্দিষ্ট করে +1 গ্রীষ্মকালীন সময়ের অফসেট যুক্ত করতে আপনার টাইমস্ট্যাম্প গ্রীষ্মের ডিএসটিতে পড়ে কিনা তা পরীক্ষা করে দেখতে হবে। যেহেতু এই অন্তরগুলি 1 বা 2 দিনের সাথে পরিবর্তিত হয়, তাই আমি এমন একটি এপ্রোক্সিমেশন ব্যবহার করব যা মাসের রেকর্ডগুলির শেষের উপর প্রভাব ফেলবে না, তাই এই ক্ষেত্রে আমি প্রতি বছর সঠিক বিরতি উপেক্ষা করতে পারি।
যদি আরও সুনির্দিষ্ট ক্যোয়ারী তৈরি করতে হয়, তবে আপনাকে আরও কেসগুলি তৈরি করতে শর্ত যুক্ত করতে হবে। তবে মোটামুটিভাবে, আপনি যখন আপনার ডাটাবেজে টাইমজোন ছাড়াই টাইমস্ট্যাম্প খুঁজে পান তখন সময়সীমা এবং সামারটাইমের সাথে সম্মতিতে মাসে মাসে বিভাজন তথ্যতে এটি কাজ করবে:
SELECT
"id", "Product", "Sale",
date_trunc('month',
CASE WHEN
Extract(month from t."date") > 03 AND
Extract(day from t."date") > 26 AND
Extract(hour from t."date") > 3 AND
Extract(month from t."date") < 10 AND
Extract(day from t."date") < 29 AND
Extract(hour from t."date") < 4
THEN
t."date" at time zone '+03' -- Romania TimeZone offset + DST
ELSE
t."date" at time zone '+02' -- Romania TimeZone offset
END) as "date"
FROM
public."Table" AS t
WHERE 1=1
AND t."date" >= '01/07/2015 00:00:00'::TIMESTAMP WITHOUT TIME ZONE
AND t."date" < '01/07/2017 00:00:00'::TIMESTAMP WITHOUT TIME ZONE
GROUP BY date_trunc('month',
CASE WHEN
Extract(month from t."date") > 03 AND
Extract(day from t."date") > 26 AND
Extract(hour from t."date") > 3 AND
Extract(month from t."date") < 10 AND
Extract(day from t."date") < 29 AND
Extract(hour from t."date") < 4
THEN
t."date" at time zone '+03' -- Romania TimeZone offset + DST
ELSE
t."date" at time zone '+02' -- Romania TimeZone offset
END)