পোস্টগ্র্রেএসকিউএল-তে ডিফল্ট মান হিসাবে ইউটিসিতে বর্তমান সময়কে ব্যবহার করা


172

আমার কাছে TIMESTAMP WITHOUT TIME ZONEটাইপের একটি কলাম রয়েছে এবং এটি ইউটিসিতে বর্তমান সময়ে ডিফল্ট থাকতে চাই। ইউটিসিতে বর্তমান সময় পাওয়া সহজ:

postgres=# select now() at time zone 'utc';
          timezone          
----------------------------
 2013-05-17 12:52:51.337466
(1 row)

যেমনটি একটি কলামের জন্য বর্তমান টাইমস্ট্যাম্প ব্যবহার করছে:

postgres=# create temporary table test(id int, ts timestamp without time zone default current_timestamp);
CREATE TABLE
postgres=# insert into test values (1) returning ts;
             ts             
----------------------------
 2013-05-17 14:54:33.072725
(1 row)

তবে এটি স্থানীয় সময় ব্যবহার করে। সিনট্যাক্স ত্রুটির ফলে এটি ইউটিসির কাছে চাপিয়ে দেওয়ার চেষ্টা করা হচ্ছে:

postgres=# create temporary table test(id int, ts timestamp without time zone default now() at time zone 'utc');
ERROR:  syntax error at or near "at"
LINE 1: ...int, ts timestamp without time zone default now() at time zo...

উত্তর:


297

একটি ফাংশন এমনকি প্রয়োজন হয় না। কেবলমাত্র ডিফল্ট এক্সপ্রেশনটির আশেপাশে বন্ধনী রাখুন

create temporary table test(
    id int, 
    ts timestamp without time zone default (now() at time zone 'utc')
);

2
প্রশ্নগুলি লিখতে গিয়ে আমি এখন_আউটসি () এর মতো একটি ফানসিটন দেখতে পাচ্ছি
মিসেক্সি

এমনকি সময়টি এক ঘন্টা পিছনে গেলে এটি কাজ করে - এখন () এমন একটি টাইমস্ট্যাম্প দেয় যা ইউটিসি থেকে অফসেটটি জানে।
ক্লে লেনার্ট

1
FWIW, পোস্টগ্রি 11.5 মধ্যে এই প্রশ্নের সাথে চলমান: ALTER TABLE testcase_result ADD COLUMN date_created TIMESTAMP WITHOUT TIME ZONE DEFAULT (NOW() AT TIME ZONE "UTC") NOT NULL;সঙ্গে ব্যর্থ হলে: ERROR: column "UTC" does not existনিশ্চিত হোন যে 'utc'সমস্ত নিম্নতর ক্ষেত্রে রয়েছে।
কোড_ড্রেড

2
সংশোধন: 'utc'স্ট্রিংটি অবশ্যই একক-উদ্ধৃত হওয়া উচিত, ডাবল-কোটেড নয়।
কোড_ড্রেড



16

কি সম্পর্কে

now()::timestamp

যদি আপনার অন্যান্য টাইমস্ট্যাম্প সময় অঞ্চল ছাড়া হয় তবে এই কাস্টটি বর্তমান সময়ের জন্য "টাইমস্ট্যাম্প ছাড়াই টাইমস্ট্যাম্প" মিলবে the

যদিও অন্যরা সেই বিকল্প সম্পর্কে কী ভাবছেন তা পড়তে চাই। আমি এখনও টাইম জোনের স্টাফগুলি "সাথে / ছাড়া" এই সম্পর্কে আমার বোঝার উপর বিশ্বাস করি না।

সম্পাদনা: মাইকেল একোকার মন্তব্য এখানে যুক্ত করা কারণ এটি একটি গুরুত্বপূর্ণ বিষয়টিকে স্পষ্ট করে:

সতর্কীকরণ। প্রশ্নটি টাইমস্ট্যাম্প কলামের জন্য ইউটিসিতে ডিফল্ট টাইমস্ট্যাম্প উত্পন্ন করার বিষয়ে যা সময় অঞ্চলটি সংরক্ষণ না করার জন্য ঘটে (সম্ভবত কারণ আপনি যদি জানেন যে আপনার সমস্ত টাইমস্ট্যাম্পগুলি একই ভাগ করে দেয়) তবে সময় অঞ্চলটি সংরক্ষণ করার দরকার নেই। আপনার সমাধানটি যা করে তা একটি স্থানীয় টাইমস্ট্যাম্প উত্পন্ন করা (যা বেশিরভাগ লোকের জন্য প্রয়োজনীয়ভাবে ইউটিসি তে সেট করা হবে না) এবং এটিকে একটি নিষ্কলঙ্ক টাইমস্ট্যাম্প হিসাবে সংরক্ষণ করা হয় (যা তার সময় অঞ্চল নির্দিষ্ট করে না)।


এটি একটি আকর্ষণীয় কৌশল তবে আপনি এই আচরণ সম্পর্কে অবহিত না হলে এটি বিভ্রান্তির কারণ হতে পারে। গৃহীত উত্তরটি ক্রিয়াস্ট্রিটি ক্রিয়াকলাপের উপর কার্যকর এবং ফলাফল পছন্দসই। ফাংশনটি একই তবে আমি ডিবিতে ফাংশন থেকে দূরে থাকি ....
ফ্র্যাঙ্ক ভি

আমার বিকল্পে এটি স্থানীয়
তারিখের সময়টি

সতর্কীকরণ। প্রশ্নটি টাইমস্ট্যাম্প কলামের জন্য ইউটিসিতে ডিফল্ট টাইমস্ট্যাম্প উত্পন্ন করার বিষয়ে যা সময় অঞ্চলটি সংরক্ষণ না করার জন্য ঘটে (সম্ভবত কারণ আপনি যদি জানেন যে আপনার সমস্ত টাইমস্ট্যাম্পগুলি একই ভাগ করে দেয়) তবে সময় অঞ্চলটি সংরক্ষণ করার দরকার নেই। আপনার সমাধানটি যা করে তা একটি স্থানীয় টাইমস্ট্যাম্প উত্পন্ন করা (যা বেশিরভাগ লোকের জন্য প্রয়োজনীয়ভাবে ইউটিসি তে সেট করা হবে না) এবং এটিকে একটি নিষ্কলঙ্ক টাইমস্ট্যাম্প হিসাবে সংরক্ষণ করা হয় (যা তার সময় অঞ্চল নির্দিষ্ট করে না)।
মাইকেল একোকা

@ মিশেলএকোকা আমি উত্তরে আপনার মন্তব্য যুক্ত করেছি - দয়া করে এগিয়ে যান এবং আপনি চাইলে এটি সম্পাদনা করুন। আপনি এটি খুব স্পষ্টভাবে ব্যাখ্যা করছেন। ধন্যবাদ!
রিসাদিনহা

সতর্কতা : সময় অঞ্চল ক্ষেত্রের সাথে একটি টাইমস্ট্যাম্প যুক্তিসঙ্গত অনুমানের বিপরীতে সময় অঞ্চলটি সংরক্ষণ করে না। নীচের লিঙ্কটি দেখুন এবং ইউটিসির জন্য পৃষ্ঠাটি অনুসন্ধান করুন। ইনপুট-এ, টাইম জোন সহ একটি টাইমস্ট্যাম্প ইনকামিং মানটিকে ইউটিসি তে রূপান্তর করে এবং কোনও মূল্য সময় বা অফিশ্চিত তথ্য না করে এই মানটিকে সঞ্চয় করে । আউটপুটে, সঞ্চিত ইউটিসি মানটি যদি পাওয়া যায় তবে ক্লায়েন্টের সময় অঞ্চল ব্যবহার করে স্থানীয় সময় রূপান্তরিত হয় to এই টাইপটি কোয়েরি সময়ে মান রূপান্তর সম্পর্কে। এক সময় অঞ্চল থেকে সংগ্রহ করে এবং অন্য কোনওটি থেকে নির্বাচন করে আপনার এটি পরীক্ষা করা উচিত। postgresql.org/docs/11/datatype-datetime.html
টম

7

এটি 2 সমতুল্য সমাধান:

(নিচের কোডটি, আপনি প্রতিস্থাপন করা উচিত 'UTC'জন্য জোন এবং now()জন্য টাইমস্ট্যাম্প )

  1. timestamp AT TIME ZONE zone - এসকিউএল-মান-অনুসারে
  2. timezone(zone, timestamp) - তর্কযোগ্যভাবে আরও পাঠযোগ্য

ফাংশন টাইমজোন (জোন, টাইমস্ট্যাম্প) এসকিউএল-কনফর্মিং কনস্ট্রাক্ট টাইমস্ট্যাম্প টাইম জোন জোনের সমান।


ব্যাখ্যা:

  • অঞ্চলটি পাঠ্য স্ট্রিং (উদাহরণস্বরূপ 'UTC') বা অন্তর (যেমন, INTERVAL '-08:00') হিসাবে নির্দিষ্ট করা যেতে পারে - এখানে সমস্ত উপলভ্য সময় অঞ্চলগুলির তালিকা রয়েছে
  • টাইমস্ট্যাম্প ধরনের কোনো মান হতে পারে টাইমস্ট্যাম্প
  • now()আপনার ডাটাবেসের ডিফল্ট সময় অঞ্চল সংযুক্ত (যেমন ) টাইমস্ট্যাম্পের টাইপ (আমাদের যা প্রয়োজন কেবল তা 2018-11-11T12:07:22.3+05:00) প্রদান করে।
  • timezone('UTC', now())আমাদের বর্তমান সময়কে ( টাইম জোন সহ টাইমস্ট্যাম্পের টাইপ ) টাইমজোনলেস সমতুল্য রূপান্তর করে UTC
    যেমন, SELECT timestamp with time zone '2020-03-16 15:00:00-05' AT TIME ZONE 'UTC'ফিরে আসবে 2020-03-16T20:00:00Z

দস্তাবেজ: সময় অঞ্চল ()


1
এই বিষয়গুলির সংক্ষিপ্তসার জন্য ধন্যবাদ। আমি ছোট হাতের সংস্করণ ব্যবহার করেছি at timezone 'utc'এবং এটি আমার পোস্টগ্রিসএসকিউএল সেটআপের সাথে কাজ করে না। বড় হাতের অক্ষর ব্যবহার করে সমস্যার সমাধান হয়েছে
জেরাদ্লাস_আরইউ

2

ফাংশন ইতিমধ্যে বিদ্যমান: টাইমজোন ('ইউটিসি' :: পাঠ্য, এখন ())

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