अब () और current_timestamp के बीच अंतर


45

PostgreSQL में, मैं 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)

ये SQL- मानक कार्य वर्तमान लेनदेन के प्रारंभ समय के आधार पर सभी रिटर्न मान प्रदान करते हैं:
... ...
CURRENT_TIMESTAMP

2)

transaction_timestamp()के बराबर है CURRENT_TIMESTAMP, लेकिन यह स्पष्ट रूप से प्रतिबिंबित करता है कि यह क्या लौटाता है।

3)

now()के बराबर एक पारंपरिक PostgreSQL है transaction_timestamp()

बोल्ड जोर मेरा। CURRENT_TIMESTAMP, transaction_timestamp()और now()ऐसा बिल्कुल एक ही। CURRENT_TIMESTAMPएक समारोह के लिए एक वाक्यात्मक विषमता है, जिसमें कोष्ठक की जोड़ी नहीं है। यह SQL मानक के अनुसार है।

यदि आप SQL कथन में फ़ंक्शन कॉल के लिए स्तंभ उपनाम घोषित नहीं करते हैं, तो उपनाम फ़ंक्शन के नाम के लिए डिफॉल्ट करता है। आंतरिक रूप से, मानक-एसक्यूएल के CURRENT_TIMESTAMPसाथ लागू किया जाता है now()। 9.6 के बाद के पोस्टग्रेज में परिणामी कॉलम नाम से पता चलता है , जो "अब" था, लेकिन पोस्टग्रेज 10 में "current_timestamp" में बदल गया।

transaction_timestamp() वही करता है, लेकिन यह एक उचित पोस्टग्रेज फ़ंक्शन है, इसलिए डिफ़ॉल्ट रूप से उपनाम हमेशा "लेनदेन_टिमस्टैम्प" रहा है।

विशेष इनपुट स्थिरांक के साथ इन कार्यों में से किसी को भी भ्रमित करें । यह विशिष्ट तिथि / समय / टाइमस्टैम्प मूल्यों के लिए कई उल्लेखनीय शॉर्टहैंड्स में से एक है, जो मैनुअल को उद्धृत करता है:'now'

... जिसे पढ़ते समय साधारण दिनांक / समय मान में बदल दिया जाएगा। (विशेष रूप से, nowऔर संबंधित तार पढ़े जाते ही एक विशिष्ट समय मान में बदल जाते हैं।) SQL कमांड में स्थिरांक के रूप में उपयोग किए जाने पर इन सभी मानों को एकल उद्धरणों में संलग्न करने की आवश्यकता होती है।

यह इस भ्रम में जोड़ सकता है कि (कम से कम पोस्टग्रेज 12 तक) किसी भी अग्रणी और अनुगामी रिक्त स्थान और कोष्ठक ( {[( )]}) को उन विशेष इनपुट मानों से छंटनी की जाती है। इसलिए 'now()'::timestamptz- या 'now()'जहां कोई स्पष्ट प्रकार कास्ट की आवश्यकता नहीं है - यह भी मान्य है और now() अधिकांश टाइमटेस्ट में फ़ंक्शन के समान टाइमस्टैम्प का मूल्यांकन करने के लिए होता है । लेकिन उन हैं स्थिरांक और आम तौर पर नहीं है कि तुम क्या उदाहरण के लिए स्तंभ डिफ़ॉल्ट के रूप में चाहते हैं।

db <> यहाँ field
पुरानी SQL fiddle

उल्लेखनीय विकल्प हैं statement_timestamp()और clock_timestamp()नियम पुस्तिका:

statement_timestamp()वर्तमान कथन का प्रारंभ समय (अधिक विशेष रूप से, क्लाइंट से नवीनतम कमांड संदेश की प्राप्ति का समय) देता है। [...]
clock_timestamp()वास्तविक वर्तमान समय लौटाता है, और इसलिए एक SQL कमांड के भीतर भी इसका मूल्य बदल जाता है।

नोट: statement_timestamp()है STABLEके रूप में ऊपर (हमेशा एक ही एसक्यूएल आदेश के भीतर एक ही मान देता है)। लेकिन clock_timestamp()जरूरी तो है ही VOLATILE। अंतर महत्वपूर्ण हो सकता है।


लेकिन, क्या यह क्वेरी ऑप्टिमाइज़ेशन के लिए अंतर करता है? अब () को हर पंक्ति के लिए निष्पादित किया जाएगा where items.createddate > now():?
सैंटियागो एरीज़टी

3
@santiagoarizti: No. 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 संस्करण 7.2 के रूप में, 'वर्तमान' अब दिनांक / समय स्थिरांक के रूप में समर्थित नहीं है

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

और 'transaction_timestamp()'बस tz मान के साथ टाइमस्टैम्प के रूप में पुनर्गठित नहीं किया गया है:

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
इरविन ब्रान्डेसटेटर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.