Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

TO_DATE yy,yyyy मुझे अलग परिणाम देता है

क्योंकि आप स्ट्रिंग से तारीख तक एक अनावश्यक स्पष्ट रूपांतरण कर रहे हैं, जो एक अंतर्निहित . कर रहा है आपकी 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 आपको वास्तव में एक स्ट्रिंग का उपयोग करने की आवश्यकता है।)

अनिवार्य रूप से:एनएलएस सेटिंग्स या तारीखों के स्ट्रिंग्स या इसके विपरीत के निहित रूपांतरणों पर भरोसा न करें।

इस मामले में आपको किसी की आवश्यकता नहीं है रूपांतरण, इसलिए इस उत्तर के शीर्ष पर सरल कथन का उपयोग करें।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. डेटाबेस कनेक्शन हमेशा डीबी के समान पीसी पर विकसित होने पर डिस्कनेक्ट करें

  2. तालिका में सभी पंक्तियों को अद्यतन करने का प्रभावी तरीका

  3. Oracle:वर्ष -4713 और +9999 के बीच होना चाहिए, और 0 . नहीं होना चाहिए

  4. ODP.NET आउटपुट स्ट्रिंग पैरामीटर मान वापस नहीं करता है

  5. Oracle MySQL INSERT IGNORE के बराबर है?