यह बग नहीं है, यह एक विशेषता है... यहां दो बिंदु हैं।
-
'अभी' का प्रतिस्थापन
आइए दस्तावेज़ीकरण पर एक नज़र डालें (Date /समय कार्य और ऑपरेटर ):
तो
'now'
पार्स समय पर टाइमस्टैम्प में बदल दिया जाता है। -
तैयार बयान
ठीक है, लेकिन कार्यों के संबंध में इसका क्या अर्थ है? यह प्रदर्शित करना आसान है कि किसी फ़ंक्शन को हर बार कॉल करने पर उसकी व्याख्या की जाती है:
t=# create function test() returns timestamp as $$ begin return 'now'; end; $$ language plpgsql; CREATE FUNCTION t=# select test(); test ---------------------------- 2015-12-11 11:14:43.479809 (1 row) t=# select test(); test ---------------------------- 2015-12-11 11:14:47.350266 (1 row)
इस उदाहरण में
'now'
आपकी अपेक्षा के अनुरूप व्यवहार करता है।क्या अंतर है? आपका फ़ंक्शन SQL कथन का उपयोग करता है, और परीक्षण() नहीं करता है। आइए फिर से दस्तावेज़ीकरण देखें (PL/ pgSQL योजना कैशिंग ):
और यहाँ (विवरण तैयार करें ):
इसलिए
'now'
एक टाइमस्टैम्प में बदल दिया गया था जब तैयार बयान को पार्स किया गया था। आइए एक फ़ंक्शन के बाहर एक तैयार स्टेटमेंट बनाकर इसे प्रदर्शित करें:t=# prepare s(integer) as UPDATE test_date_bug SET date2 = 'now' WHERE id = $1; PREPARE t=# execute s(1); UPDATE 1 t=# execute s(2); UPDATE 1 t=# select * from test_date_bug; id | date1 | date2 ----+-------------------------------+------------------------------- 3 | 2015-12-11 11:01:38.491656+03 | infinity 1 | 2015-12-11 11:01:37.91818+03 | 2015-12-11 11:40:44.339623+03 2 | 2015-12-11 11:01:37.931056+03 | 2015-12-11 11:40:44.339623+03 (3 rows)
वही हुआ। 'now'
एक बार टाइमस्टैम्प में बदल दिया गया था (जब तैयार स्टेटमेंट को पार्स किया गया था), और now()
दो बार बुलाया गया था।