এখন () এবং বর্তমান_টাইমস্ট্যাম্পের মধ্যে পার্থক্য


45

পোস্টগ্রেএসকিউএল এ, আমি now()এবং current_timestampফাংশনটি ব্যবহার করি এবং আমি কোনও পার্থক্য দেখি না:

# SELECT now(), current_timestamp;
              now               |              now               
--------------------------------+--------------------------------
 04/20/2014 19:44:27.215557 EDT | 04/20/2014 19:44:27.215557 EDT
(1 row)

আমি কিছু অনুপস্থিত করছি?

উত্তর:


54

এখানে কোন পার্থক্য নেই. ম্যানুয়াল থেকে তিনটি উদ্ধৃতি:

1)

এই এসকিউএল-স্ট্যান্ডার্ডগুলি বর্তমান লেনদেনের শুরু সময়ের উপর ভিত্তি করে সমস্ত রিটার্ন মানগুলি কার্যকর করে:
... ...
CURRENT_TIMESTAMP

2)

transaction_timestamp()এর সমতুল্য CURRENT_TIMESTAMP, তবে এটি কী প্রত্যাবর্তন করে তা পরিষ্কারভাবে প্রতিফলিত করার জন্য নামকরণ করা হয়েছে।

3)

now()এটি একটি চিরাচরিত PostgreSQL সমতুল্য transaction_timestamp()

বোল্ড জোর আমার। CURRENT_TIMESTAMP, transaction_timestamp()এবং now()না ঠিক একই। CURRENT_TIMESTAMPকোনও ফাংশনটির জন্য একটি সিনট্যাক্টিকাল বিজোড়তা, এতে প্রথম বন্ধনী নেই। এটি এসকিউএল স্ট্যান্ডার্ড অনুসারে।

যদি আপনি কোনও এসকিউএল স্টেটমেন্টে কোনও ফাংশন কলের জন্য একটি কলামের নাম ঘোষণা না করেন তবে উপন্যাসটি ফাংশনটির নামটিতে ডিফল্ট। অভ্যন্তরীণভাবে, স্ট্যান্ডার্ড-এসকিউএল CURRENT_TIMESTAMPপ্রয়োগ করা হয় now()। পোস্টগ্রিস 9.6 অবধি যা ফলিত কলামের নামটি দেখায় যা "এখন" ছিল তবে পোস্টগ্রিস 10-এ "কারেন্ট_টাইমস্ট্যাম্প" এ পরিবর্তিত হয়েছে।

transaction_timestamp() একই কাজ করে তবে এটি একটি যথাযথ পোস্টগ্রিস ফাংশন, তাই ডিফল্ট উপন্যাসটি সর্বদা "লেনদেনের_আদর্শনীয় স্ট্যাম্প" হয়ে থাকে।

বিশেষ ইনপুট ধ্রুবক দিয়ে এই ফাংশনগুলির কোনওটি বিভ্রান্ত করবেন নাম্যানুয়ালটি উদ্ধৃত করে নির্দিষ্ট তারিখ / সময় / টাইমস্ট্যাম্প মানগুলির জন্য এটি বেশ কয়েকটি ননেশনাল শর্টহ্যান্ডগুলির মধ্যে একটি:'now'

... যা পড়লে সাধারণ তারিখ / সময়ের মানগুলিতে রূপান্তরিত হবে। (বিশেষত, nowএবং সম্পর্কিত স্ট্রিংগুলি পড়ার সাথে সাথে একটি নির্দিষ্ট সময়ের মানতে রূপান্তরিত হয়)) এসকিউএল কমান্ডের ধ্রুবক হিসাবে ব্যবহৃত হলে এই সমস্ত মানকে একক উদ্ধৃতিতে আবদ্ধ করা দরকার।

এটি বিভ্রান্তি যুক্ত করতে পারে যে (কমপক্ষে 12 পোস্টগ্রিজ অবধি) যে কোনও সংখ্যক নেতৃস্থানীয় এবং অনুসরণযোগ্য স্পেস এবং বন্ধনী ( {[( )]}) এই বিশেষ ইনপুট মানগুলি থেকে ছাঁটা হয়েছে। সুতরাং 'now()'::timestamptz- বা 'now()'যেখানে কোনও স্পষ্টত ধরণের কাস্ট প্রয়োজন হয় না - এটি বৈধ এবং now() বেশিরভাগ প্রসঙ্গে যেমন ফাংশন হিসাবে একই টাইমস্ট্যাম্পের মূল্যায়ন করতে ঘটে । তবে সেগুলি ধ্রুবক এবং সাধারণত কলামের ডিফল্ট হিসাবে আপনি যা চান না তা উদাহরণস্বরূপ।

ডিবি <> ফ্রিডল এখানে
পুরানো এসকিউএল ফিডল

উল্লেখযোগ্য বিকল্পগুলি হ'ল statement_timestamp()এবং clock_timestamp()ম্যানুয়াল:

statement_timestamp()বর্তমান বিবৃতিটির শুরুর সময়টি (আরও নির্দিষ্টভাবে, ক্লায়েন্টের কাছ থেকে সর্বশেষ কমান্ড বার্তা প্রাপ্তির সময়) প্রদান করে। [...]
clock_timestamp()আসল বর্তমান সময়টি ফেরত দেয়, এবং সেইজন্য এর মান একটি একক এসকিউএল কমান্ডের মধ্যেও পরিবর্তিত হয়।

নোট: statement_timestamp()হয় STABLEউপরের হিসাবে (সবসময় একই SQL কমান্ড মধ্যে একই মান)। কিন্তু clock_timestamp()অগত্যা শুধুমাত্র VOLATILE। পার্থক্য উল্লেখযোগ্য হতে পারে।


কিন্তু, এটি কি ক্যোয়ারী অপ্টিমাইজেশনের জন্য কোনও পার্থক্য করে? : এখন () প্রতিটি সারিতে মৃত্যুদন্ড কার্যকর করা হবে where items.createddate > now()?
সান্টিয়াগো আরিজিটি

3
@ সান্টিয়াগোরিজিটি: নং now()সংজ্ঞায়িত হয়েছে STABLEকারণ এটি একই লেনদেনের মধ্যে একই মান (বর্তমান লেনদেনের শুরু সময়) এর মূল্যায়ন করে। আমি আপনার উদাহরণ, একবারেইnow() মৃত্যুদন্ড কার্যকর ( উদাহরণস্বরূপ বিপরীতে )। clock_timestamp()
এরউইন ব্র্যান্ডস্টেটার

3

আপনি যখন এগুলি যথাযথভাবে ব্যবহার করেন তখন তাদের কোনও কার্যকরী পার্থক্য না থাকায় এগুলি আলাদাভাবে নিক্ষেপ করা হয়:

'now()'পুনঃসংযুক্ত (ঠিক যেমন 'today'বা 'now'):

b=# select 'now()'::timestamptz;
          timestamptz
-------------------------------
 2016-12-09 16:31:35.942243+00
(1 row)

'CURRENT_TIMESTAMP'অন্ধকার প্রান্ত থেকে মজার ত্রুটি দেয়

দ্রষ্টব্য: PostgreSQL সংস্করণ .2.২ অনুসারে, 'বর্তমান' আর তারিখ / সময় ধ্রুবক হিসাবে সমর্থিত নয়

b=# select 'CURRENT_TIMESTAMP'::timestamptz;
ERROR:  date/time value "current" is no longer supported
LINE 1: select 'CURRENT_TIMESTAMP'::timestamptz;
               ^

এবং 'transaction_timestamp()'টিজেড মান সহ টাইমস্ট্যাম্প হিসাবে পুনরায় সংযুক্ত করা হয় না:

b=# select 'transaction_timestamp()'::timestamptz;
ERROR:  invalid input syntax for type timestamp with time zone: "transaction_timestamp()"
LINE 1: select 'transaction_timestamp()'::timestamptz;
               ^

আপনি কেন নিক্ষেপ করবেন দয়া করে জিজ্ঞাসা করবেন না 'now()' as timestamp। আমি পিপল কোডের where timestamp_column = 'now()'পরিবর্তে দেখেছি where timestamp_column = now(), সুতরাং ভেবেছিলাম এই ব্যাখ্যাটি মজার ঘটনা এবং এরউইনের উত্তরের উত্তম সংযোজন হবে।


এটি একটি ভুল বোঝাবুঝি। ইনপুট স্ট্রিং'now()' ফাংশন অনুরূপ now()পৃষ্ঠের উপর, কিন্তু সরাসরি অন্যথায় এর সাথে সম্পর্কিত নয়। বর্তমান লেনদেনের শুরু সময়ের'now' জন্য ধ্রুবক মূল্যায়ন । চলন্ত পেরেন উপেক্ষা করা হয়। স্ট্রিং কাস্ট করার জন্য চেষ্টা বা থেকে অনুরূপ ফ্যাশন ব্যর্থ হয়, কারণ যে শুধু আজেবাজে কথা আছে। উভয়ই সম্পর্কিত ফাংশনগুলির সাথে সম্পর্কিত নয়। 'CURRENT_TIMESTAMP''transaction_timestamp()'timestamp
এরউইন ব্র্যান্ডসেটেটার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.