मेरे आवेदन में दिनांक को प्रारूपित करने और क्रमबद्ध करने का प्रयास कर रहा हूं, मैं दिनांक को अपने आवश्यक प्रारूप में प्रारूपित करने के लिए to_char() फ़ंक्शन का उपयोग कर रहा हूं, लेकिन जब मैं उन्हें सॉर्ट करता हूं तो यह इसे स्ट्रिंग सॉर्टिंग के रूप में सॉर्ट कर रहा है। लेकिन मैं चाहता हूं कि उन्हें तारीख के रूप में क्रमबद्ध किया जाए।

मुझे एक ही प्रश्न में दोनों को प्राप्त करने के लिए कुछ मदद चाहिए। कृपया मुझे उसी पर मदद करें।

मैंने जिस क्वेरी का उपयोग किया था, वह थी,

SELECT to_char( t1.your_date_column1, your_format_mask ) as alias,
  FROM your_table1 t1,your_table2
 ORDER BY t1.your_date_column1
16
Hariharbalaji 17 अगस्त 2011, 17:33
2
आप अपने आवेदन के लिए किस प्रोग्रामिंग भाषा और/या ढांचे का उपयोग कर रहे हैं?
 – 
Erich Kitzmueller
17 अगस्त 2011, 17:37
मैं Oracle 10g का उपयोग कर रहा हूं, और एप्लिकेशन एक java/j2ee एप्लिकेशन है
 – 
Hariharbalaji
17 अगस्त 2011, 17:51

7 जवाब

सबसे बढ़िया उत्तर

ऐसा लगता है कि आप कुछ ऐसा चाहते हैं

SELECT to_char( your_date_column, your_format_mask )
  FROM your_table
 ORDER BY your_date_column

SELECT सूची में, आप एक वर्ण स्ट्रिंग वापस करना चाहते हैं जो आपके पसंदीदा प्रारूप में दिनांक का प्रतिनिधित्व करती है। ORDER BY क्लॉज में, आप वास्तविक तिथि के अनुसार ऑर्डर करना चाहते हैं। उदाहरण के लिए, मानक EMP और DEPT तालिकाओं का उपयोग करना

SQL> ed
Wrote file afiedt.buf

  1  select to_char( hiredate, 'DD-MM-YYYY' )
  2    from emp,
  3         dept
  4   where emp.deptno = dept.deptno
  5*  order by hiredate
SQL> /

TO_CHAR(HI
----------
17-12-1980
20-02-1981
22-02-1981
02-04-1981
01-05-1981
09-06-1981
08-09-1981
28-09-1981
17-11-1981
03-12-1981
03-12-1981
23-01-1982
19-04-1987
23-05-1987

14 rows selected.

यदि आप एक DISTINCT जोड़ते हैं, तो समस्या यह है कि Oracle यह नहीं जानता है कि आप जिस फ़ंक्शन को लागू कर रहे हैं (इस मामले में TO_CHAR) तालिका में डेटा से आउटपुट में डेटा तक एक-से-एक मैपिंग प्रदान करता है। उदाहरण के लिए, दो अलग-अलग तिथियां (1 अक्टूबर, 2010 10:15:15 और 1 अक्टूबर, 2010 23:45:50) एक ही वर्ण आउटपुट उत्पन्न कर सकती हैं, जिससे ओरेकल को दो '01-10-2010' स्ट्रिंग्स में से एक को खत्म करने के लिए मजबूर किया जा सकता है। लेकिन दोनों तिथियां अलग-अलग क्रमबद्ध होंगी। आप अपनी क्वेरी को नेस्ट करके और DISTINCT करने के बाद और ORDER BY करने से पहले स्ट्रिंग को वापस डेट में कनवर्ट करके उस समस्या को ठीक कर सकते हैं।

SQL> ed
Wrote file afiedt.buf

  1  select hire_date_str
  2    from (
  3      select distinct to_char( hiredate, 'DD-MM-YYYY' ) hire_date_str
  4        from emp,
  5             dept
  6       where emp.deptno = dept.deptno
  7      )
  8*  order by to_date(hire_date_str,'DD-MM-YYYY')
SQL> /

HIRE_DATE_
----------
17-12-1980
20-02-1981
22-02-1981
02-04-1981
01-05-1981
09-06-1981
08-09-1981
28-09-1981
17-11-1981
03-12-1981
23-01-1982
19-04-1987
23-05-1987

13 rows selected.
20
Justin Cave 30 अगस्त 2011, 17:47
जस्टिन: मैंने वही कोशिश की जिसका आपने उल्लेख किया है। लेकिन मुझे त्रुटि मिली। त्रुटि संदेश ORA-01791 था "चयनित अभिव्यक्ति नहीं"
 – 
Hariharbalaji
17 अगस्त 2011, 17:45
- मैंने काम करने वाली क्वेरी के उदाहरण के साथ अद्यतन किया। क्या आप उस वास्तविक क्वेरी को पोस्ट कर सकते हैं जिसका आप उपयोग कर रहे हैं जो यह त्रुटि उत्पन्न करती है?
 – 
Justin Cave
17 अगस्त 2011, 17:51
@ जस्टिन: जब मैं उस विधि को करने का प्रयास करता हूं जिसे आपने एक टेबल में बताया है तो यह ठीक काम कर रहा है, लेकिन जब मैं दो टेबल में शामिल होने का प्रयास करता हूं और यह मुझे समस्या दे रहा है।
 – 
Hariharbalaji
17 अगस्त 2011, 18:28
1
- मैंने दो तालिकाओं में शामिल होने के लिए अपना उदाहरण संशोधित किया ताकि यह ठीक काम करे। क्या आप एक टेस्ट केस पोस्ट कर सकते हैं जो समस्या को पुन: उत्पन्न करता है (यानी टेबल स्टेटमेंट बनाएं, कुछ नमूना पंक्तियों को सम्मिलित करने के लिए डीएमएल, और अपवाद उत्पन्न करने वाली क्वेरी)?
 – 
Justin Cave
17 अगस्त 2011, 18:57
देरी से प्रतिक्रिया के लिए क्षमा चाहते हैं, मुझे समस्या का पता चला। चुनिंदा क्लॉज में मैंने अलग दिया था, जब मैंने इसे हटा दिया तो यह उम्मीद के मुताबिक काम कर रहा है। लेकिन मुझे समझ में नहीं आया कि अगर मैं चुनिंदा खंड में अलग देता हूं तो यह एक त्रुटि क्यों फेंक रहा था
 – 
Hariharbalaji
30 अगस्त 2011, 16:13

सबसे आसान तरीका है कि उसी फ़ील्ड को फिर से क्वेरी के साथ पुनर्प्राप्त करना और उस दायर के आधार पर सॉर्टिंग करना

आपके उदाहरण में

SELECT 
         to_char( your_date_column, your_format_mask ) as formate_purpose,
         your_date_column as sorting_purpose
FROM your_table

ORDER BY your_date_column
3
Hardik Bhalani 28 अप्रैल 2012, 11:10
SELECT 
         to_char( your_date_column, your_format_mask ) as formate_purpose,

FROM your_table

ORDER BY to_date (formate_purpose)

उपरोक्त कोड का प्रयास करें

3
Stewartside 26 मार्च 2014, 21:13

आप यह नहीं कहते कि आपका आवेदन किसमें लिखा गया है, लेकिन कुछ वातावरणों में (जैसे Oracle APEX, Oracle रिपोर्ट्स) समाधान यह है कि क्वेरी में to_char का उपयोग नहीं करें, लेकिन फिर आवेदन करें उपकरण के "स्तंभ गुण" या समान में वांछित स्वरूपण।

2
Tony Andrews 17 अगस्त 2011, 17:41

यदि आप Oracle को सॉर्ट करने देते हैं (अनुशंसित), तो इसे जस्टिन केव के उत्तर में वर्णित की तरह ही करें। यदि, किसी कारण से, आप जावा में छँटाई करते हैं, तो to_char का उपयोग न करें; इसके बजाय दिनांकों को Date ऑब्जेक्ट के रूप में प्राप्त करें और उदा। a SimpleDateFormat जावा में फ़ॉर्मेटिंग करने के लिए (सॉर्ट करने के बाद)।

1
Erich Kitzmueller 17 अगस्त 2011, 18:11
पहले मैंने वही काम किया है जैसे SimpleDateFormat के साथ स्वरूपण, लेकिन अगर मेरे पास कुछ 75 रिकॉर्ड्स का बड़ा डेटा है तो मुझे एक ही ऑपरेशन को लूप में करना पड़ा। तो इसे क्वेरी स्तर में ही स्वरूपित करने के बारे में सोचा
 – 
Hariharbalaji
17 अगस्त 2011, 18:32

एसक्लप्लस के लिए, सत्र सेट nls_date_format का उपयोग करें जो आप चाहते हैं कि दिनांक प्रारूप क्या हो, फिर बस अपने चयन कथन और क्रम क्रम में कॉलम नाम का उपयोग करें।

0
Chris Panagopoulos 30 अगस्त 2013, 18:02

मैं दिनांक फ़ील्ड द्वारा समूहबद्ध और आदेश देना चाहता था लेकिन दिनांक फ़ील्ड में समय शामिल था और मैं समूहीकरण और सॉर्टिंग में समय शामिल नहीं करना चाहता था। इसलिए मैंने तिथि को चरित्र में परिवर्तित कर दिया और फिर समय को समाप्त करने के लिए चरित्र को वापस तिथि में परिवर्तित कर दिया और दिनांक के अनुसार पाठ द्वारा क्रमबद्ध नहीं किया। इसने डेटा को तिथि के अनुसार समूहीकृत किया और तिथि के अनुसार क्रमबद्ध किया।

-- Projects initiated by Day.
select to_date(to_char(psd.PROJECTSTATUSDATE, 'mm/dd/yyyy'),'mm/dd/yyyy') as "Date", count(*)
from project pj, project_status_date psd
where PJ.PROJECTTOKEN = PSD.PROJECTTOKEN
      and psd.PROJECTSTATUSDATE > '01-JAN-2001'
      and PSD.PROJECTSTATUSCODE = 'BL'
group by to_date(to_char(psd.PROJECTSTATUSDATE, 'mm/dd/yyyy'),'mm/dd/yyyy') 
order by to_date(to_char(psd.PROJECTSTATUSDATE, 'mm/dd/yyyy'),'mm/dd/yyyy') 

Date      Count
8/16/2013   102
8/19/2013   77
8/20/2013   257
8/21/2013   30
8/22/2013   173
8/23/2013   125
8/26/2013   41
8/27/2013   25
8/28/2013   14
-1
dave mc 24 अप्रैल 2014, 20:37
trunc फ़ंक्शन किसी भी रूपांतरण की आवश्यकता के बिना समय निकाल देता है। इसके अलावा, विधेय में एक निहित दिनांक प्रारूप है; date '2001-01-01' हर जगह काम करेगा, लेकिन 01-JAN-2001 तभी काम करेगा जब क्लाइंट प्रोग्राम में एक विशिष्ट तिथि प्रारूप और भाषा हो।
 – 
Jon Heller
24 अप्रैल 2014, 21:56