क्योंकि आप स्ट्रिंग से तारीख तक एक अनावश्यक स्पष्ट रूपांतरण कर रहे हैं, जो एक अंतर्निहित . कर रहा है आपकी NLS सेटिंग के आधार पर दिनांक से स्ट्रिंग में रूपांतरण।
आपको बस इतना करना चाहिए:
select to_char(sysdate - 7, 'year') from dual;
TO_CHAR(SYSDATE-7,'YEAR')
------------------------------------------
twenty seventeen
क्योंकि sysdate-7
पहले से ही एक तारीख है, आपको to_date()
calling पर कॉल नहीं करना चाहिए उसके आसपास, किसी भी प्रारूप के साथ। to_date()
. के रूप में फ़ंक्शन एक स्ट्रिंग तर्क लेता है, आपका sysdate-7
अभिव्यक्ति को पहले एक स्ट्रिंग में निहित रूप से परिवर्तित किया जाना है। तो आप वास्तव में कर रहे हैं:
select to_char(to_date(to_char(sysdate - 7), 'DD/MM/YYYY'), 'year') from dual;
जो निहित आंतरिक to_char()
. के लिए आपके NLS_DATE_FORMAT मान का उपयोग कर रहा है कॉल करें, इसलिए यदि वह 'DD-MON-RR'
है आप वास्तव में कर रहे हैं:
select to_char(to_date(to_char(sysdate - 7, 'DD-MON-RR'), 'DD/MM/YYYY'), 'year') from dual;
यह देखने के लिए कि वहां क्या हो रहा है, आपको यह देखना होगा कि पूर्ण जनरेट की गई तिथि क्या है, इसलिए उसके लिए मैं पूरे वर्ष दिखाने के लिए सत्र के लिए NLS_DATE_FORMAT को बदलने जा रहा हूं:
alter session set nls_date_format = 'SYYYY-MM-DD';
select sysdate - 7 as raw_date,
to_char(sysdate - 7, 'DD-MON-RR') as implicit_string,
to_date(to_char(sysdate - 7, 'DD-MON-RR'), 'DD/MM/YY') as implcit_yy,
to_date(to_char(sysdate - 7, 'DD-MON-RR'), 'DD/MM/YYYY') as implcit_yyyy
from dual;
RAW_DATE IMPLICIT_STRING IMPLCIT_YY IMPLCIT_YYY
----------- ------------------ ----------- -----------
2017-04-30 30-APR-17 2017-04-30 0017-04-30
पिछले दो मानों में अलग-अलग वर्षों पर ध्यान दें। दस्तावेज में प्रारूप मॉडल मिलान पर एक अनुभाग है
. आप जिस स्ट्रिंग को बीच में बना रहे हैं, उसमें 2 अंकों का वर्ष है। जब आप स्ट्रिंग को कन्वर्ट करते हैं '30-APR-17'
YY
. का उपयोग करके किसी तिथि पर वापस जाएं मॉडल, यह 'मददगार रूप से' वर्तमान शताब्दी को मानता है, इसलिए तिथि 2017 के रूप में समाप्त होती है। लेकिन जब आप उसी स्ट्रिंग को YYYY
का उपयोग करके परिवर्तित करते हैं। मॉडल यह सोचता है कि आप वास्तव में उस मूल्य का मतलब रखते हैं जिसमें आपने पारित किया है और इसलिए एक शताब्दी नहीं माना जाता है - और आपने इसे 17 पास कर दिया है, इसलिए आप वर्ष 17 के साथ समाप्त होते हैं; यानी, 0017 और 2017 नहीं। (RRRR
का उपयोग करके आपको वह उत्तर भी मिल जाएगा जिसकी आपको उम्मीद थी। , लेकिन YYYY
. से चिपके रहना बेहतर है और वास्तव में हर जगह 4-अंकीय वर्षों का उपयोग करें - if आपको वास्तव में एक स्ट्रिंग का उपयोग करने की आवश्यकता है।)
अनिवार्य रूप से:एनएलएस सेटिंग्स या तारीखों के स्ट्रिंग्स या इसके विपरीत के निहित रूपांतरणों पर भरोसा न करें।
इस मामले में आपको किसी की आवश्यकता नहीं है रूपांतरण, इसलिए इस उत्तर के शीर्ष पर सरल कथन का उपयोग करें।