Oracle डेटाबेस में, TO_TIMESTAMP_TZ()
फ़ंक्शन अपने तर्क को TIMESTAMP WITH TIME ZONE
के मान में बदल देता है डेटा प्रकार।
सिंटैक्स
वाक्य रचना इस प्रकार है:
TO_TIMESTAMP_TZ(char [ DEFAULT return_value ON CONVERSION ERROR ]
[, fmt [, 'nlsparam' ] ])
char
तर्क कोई भी अभिव्यक्ति हो सकता है जो CHAR
. के वर्ण स्ट्रिंग का मूल्यांकन करता है , VARCHAR2
, NCHAR
, या NVARCHAR2
डेटा प्रकार।
वैकल्पिक fmt
तर्क char
. के प्रारूप को निर्दिष्ट करता है . अगर आप fmt
. को छोड़ देते हैं , फिर char
TIMESTAMP WITH TIME ZONE
. के डिफ़ॉल्ट प्रारूप में होना चाहिए डेटा प्रकार, जो NLS_TIMESTAMP_TZ_FORMAT
. द्वारा निर्धारित किया जाता है इनिशियलाइज़ेशन पैरामीटर (देखें कि अपने Oracle सत्र के दिनांक स्वरूप की जाँच कैसे करें)।
वैकल्पिक 'nlsparam'
तर्क उस भाषा को निर्दिष्ट करता है जिसमें महीने और दिन के नाम और संक्षिप्त रूप दिए गए हैं। यह निम्नलिखित रूप लेता है:
'NLS_DATE_LANGUAGE = language'
उदाहरण
प्रदर्शित करने के लिए यहां एक बुनियादी उदाहरण दिया गया है:
SELECT
TO_TIMESTAMP_TZ(
'25-Aug-2030 18:10:35.123456789 +09:30',
'DD-Mon-RRRR HH24:MI:SS.FF TZH:TZM'
)
FROM DUAL;
परिणाम:
25/AUG/30 06:10:35.123456789 PM +09:30
परिणाम का प्रारूप आपके सत्र के NLS_TIMESTAMP_TZ_FORMAT
द्वारा निर्धारित किया जाता है पैरामीटर। हम NLS_TIMESTAMP_TZ_FORMAT
. के मान की जांच कर सकते हैं V$NLS_PARAMETERS
. को क्वेरी करके पैरामीटर देखें:
SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_TIMESTAMP_TZ_FORMAT';
परिणाम:
DD/MON/RR HH12:MI:SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT
. का डिफ़ॉल्ट मान पैरामीटर NLS_TERRITORY
. से लिया गया है पैरामीटर। मेरे मामले में NLS_TERRITORY
पैरामीटर है AUSTRALIA
।
जब मैं NLS_TERRITORY
बदलता हूं, तो यहां बताया गया है दूसरे क्षेत्र के लिए पैरामीटर, फिर TO_TIMESTAMP_TZ()
. पर कॉल करें फिर से:
ALTER SESSION SET NLS_TERRITORY = 'AMERICA';
SELECT
TO_TIMESTAMP_TZ(
'25-Aug-2030 18:10:35.123456789 +09:30',
'DD-Mon-RRRR HH24:MI:SS.FF TZH:TZM'
)
FROM DUAL;
परिणाम:
25-AUG-30 06.10.35.123456789 PM +09:30
इस बार परिणाम एक अलग प्रारूप में लौटाया गया है।
आप वैकल्पिक रूप से NLS_TIMESTAMP_TZ_FORMAT
का मान बदल सकते हैं सीधे पैरामीटर। यह अन्य मापदंडों को प्रभावित किए बिना उस पैरामीटर को बदल देगा। अधिक जानकारी और उदाहरणों के लिए अपने Oracle सत्र में दिनांक स्वरूप कैसे बदलें देखें।
डिफ़ॉल्ट प्रारूप
इस उदाहरण में मैं fmt
. को छोड़ देता हूं तर्क:
SELECT
TO_TIMESTAMP_TZ(
'25-AUG-30 06.10.35.123456789 PM +09:30'
)
FROM DUAL;
परिणाम:
25-AUG-30 06.10.35.123456789 PM +09:30
ऐसा करते समय, तर्क TIMESTAMP WITH TIME ZONE
के डिफ़ॉल्ट स्वरूप में होना चाहिए डेटा प्रकार, जो NLS_TIMESTAMP_TZ_FORMAT
. द्वारा निर्धारित किया जाता है पैरामीटर।
यहां एक उदाहरण दिया गया है कि क्या होता है जब हम एक मान पास करते हैं जो इस प्रारूप के अनुरूप नहीं है:
DUAL सेSELECT
TO_TIMESTAMP_TZ(
'25-Aug-2030 18:10:35.123456789 +09:30'
)
FROM DUAL;
परिणाम:
Error report - ORA-01849: hour must be between 1 and 12
इस मामले में, मैंने एक ऐसा मान पारित किया है जो 24 घंटे के समय का उपयोग करता है, लेकिन मेरा NLS_TIMESTAMP_TZ_FORMAT
पैरामीटर AM/PM डिज़ाइनर के साथ 12 घंटे की घड़ी निर्दिष्ट करता है।
इसे ठीक करने के लिए, मुझे या तो अपना इनपुट बदलना होगा, या NLS_TIMESTAMP_TZ_FORMAT
का मान बदलना होगा पैरामीटर।
रूपांतरण त्रुटि पर एक डिफ़ॉल्ट मान प्रदान करें
आपके पास उस स्थिति में लौटने के लिए एक मान प्रदान करने का विकल्प भी है, जब तर्क को TIMESTAMP WITH TIME ZONE
में कनवर्ट करते समय कोई त्रुटि होती है। टाइप करें।
उदाहरण:
SET NULL 'null';
SELECT
TO_TIMESTAMP_TZ(
'Oops!'
DEFAULT null ON CONVERSION ERROR
)
FROM DUAL;
परिणाम:
null
इस मामले में मैंने निर्दिष्ट किया है कि null
जब भी कोई रूपांतरण त्रुटि होती है तो उसे वापस कर दिया जाना चाहिए। रिटर्न वैल्यू एक एक्सप्रेशन या बाइंड वेरिएबल हो सकता है, और इसे CHAR
के कैरेक्टर स्ट्रिंग के लिए मूल्यांकन करना चाहिए , VARCHAR2
, NCHAR
, या NVARCHAR2
डेटा प्रकार, या null
. इसके बाद यह फ़ंक्शन इसे TIMESTAMP WITH TIME ZONE
. में बदल देता है . यदि इस रूपांतरण के दौरान कोई त्रुटि होती है, तो एक त्रुटि वापस आ जाती है।
उपरोक्त उदाहरण में पहली पंक्ति के संबंध में, यह केवल यह निर्दिष्ट करने के लिए है कि मेरे क्लाइंट को क्या लौटाया जाना चाहिए जब भी कोई null
मूल्य होता है। डिफ़ॉल्ट रूप से, SQLcl और SQL*Plus जब भी null
. खाली स्थान लौटाते हैं SQL SELECT
. के परिणामस्वरूप होता है बयान।
हालांकि, आप SET NULL
. का उपयोग कर सकते हैं वापस करने के लिए एक अलग स्ट्रिंग निर्दिष्ट करने के लिए। यहाँ मैंने निर्दिष्ट किया है कि स्ट्रिंग null
लौटाया जाना चाहिए।
द 'nlsparam'
तर्क
वैकल्पिक 'nlsparam'
तर्क उस भाषा को निर्दिष्ट करता है जिसमें महीने और दिन के नाम और संक्षिप्त रूप दिए गए हैं। यह निम्नलिखित रूप लेता है:
'NLS_DATE_LANGUAGE = language'
उदाहरण
SELECT
TO_TIMESTAMP_TZ(
'25-agosto-2030 18:10:35.123456789 +02:00',
'DD-Month-RRRR HH24:MI:SS.FF TZH:TZM',
'NLS_DATE_LANGUAGE = SPANISH'
)
FROM DUAL;
परिणाम:
25-AUG-30 06.10.35.123456789 PM +02:00
ध्यान दें कि परिणाम अभी भी वर्तमान सत्र के NLS_TIMESTAMP_TZ_FORMAT
के अनुसार लौटाया गया है पैरामीटर। बस इतना ही इनपुट एक अलग भाषा में था।
जब मैं agosto
को बदलता हूं तो यह होता है से August
. तक उसी 'nlsparam'
. का उपयोग करते समय मूल्य:
SELECT
TO_TIMESTAMP_TZ(
'25-August-2030 18:10:35.123456789 +02:00',
'DD-Month-RRRR HH24:MI:SS.FF TZH:TZM',
'NLS_DATE_LANGUAGE = SPANISH'
)
FROM DUAL;
परिणाम:
Error report - ORA-01843: not a valid month
ऐसा इसलिए हुआ क्योंकि मैंने 'nlsparam'
द्वारा निर्दिष्ट भाषा में तारीख प्रदान नहीं की थी तर्क (स्पेनिश)।
इसे English
में बदलना इस समस्या को हल करता है:
SELECT
TO_TIMESTAMP_TZ(
'25-August-2030 18:10:35.123456789 +02:00',
'DD-Month-RRRR HH24:MI:SS.FF TZH:TZM',
'NLS_DATE_LANGUAGE = English'
)
FROM DUAL;
परिणाम:
25-AUG-30 06.10.35.123456789 PM +02:00
अगर यह मदद करता है तो Oracle में समर्थित भाषाओं की सूची कैसे लौटाएं देखें।
अशक्त तर्क
पासिंग null
परिणाम null
:
SET NULL 'null';
SELECT
TO_TIMESTAMP_TZ(null)
FROM DUAL;
परिणाम:
null
अवैध तर्क गणना
कोई तर्क पारित किए बिना फ़ंक्शन को कॉल करने से त्रुटि होती है:
SELECT TO_TIMESTAMP_TZ()
FROM DUAL;
परिणाम:
Error report - SQL Error: ORA-00938: not enough arguments for function 00938. 00000 - "not enough arguments for function"
हालाँकि, बहुत अधिक तर्क पारित करने से कोई समस्या नहीं होती है, जब तक कि पहले तीन मान्य हैं:
SELECT
TO_TIMESTAMP_TZ(
'25-Aug-2030 18:10:35.123456789 +09:30',
'DD-Mon-RRRR HH24:MI:SS.FF TZH:TZM',
'NLS_DATE_LANGUAGE = English',
'Oops!',
'Dang!',
'Homer',
'Symptom'
)
FROM DUAL;
परिणाम:
25-AUG-30 06.10.35.123456789 PM +09:30