समस्या दुगनी है। सबसे पहले तिथियों में लगभग निश्चित रूप से समय-घटक होते हैं। to_date('06-MAR-11','DD-MON-YY')
2011/03/06 00:00:00
. के बराबर है . यदि आप TRUNC()
. का उपयोग करते हैं समारोह आप उस दिन के लिए सब कुछ देख पाएंगे:
select *
from test_table
where trunc(creation_date) = to_date('06-MAR-11','DD-MON-YY');
मैं नहीं होता सोम डेटाटाइम प्रारूप मॉडल का उपयोग करें। जैसा कि मैं यहां समझाता हूं यह आपके क्षेत्र और सेटिंग्स पर निर्भर करता है। इसके बजाय संख्यात्मक माह प्रारूप मॉडल का उपयोग करना सुरक्षित है। समान रूप से, हमेशा शतक को वर्ष के हिस्से के रूप में निर्दिष्ट करें।
where trunc(creation_date) = to_date('06-03-YY11','DD-MM-YYYY');
आपकी दूसरी समस्या लगभग निश्चित रूप से आपकी NLS_DATE_FORMAT है; ऐसा लगता है कि यह समय को ध्यान में नहीं रखता है, इसलिए आपको 4 समान तिथियां क्यों दिखाई देती हैं। यह केवल उस तरीके को नियंत्रित करता है जिसमें डेटा दिखाया जाता है यह नहीं है कि इसे कैसे संग्रहीत किया जाता है।
आप इसे कुछ इस तरह से बदल सकते हैं:
ALTER SESSION SET NLS_DATE_FORMAT = "DD/MM/YYYY HH24:MI:SS"
अगर मैं निम्नलिखित का उपयोग करके एक परीक्षण वातावरण स्थापित करता हूं:
create table test_table ( creation_date date );
insert into test_table values ( sysdate );
insert into test_table values ( sysdate - 0.01 );
alter session set nls_date_format = "YYYY/MM/DD";
आप देख सकते हैं कि लौटाए गए डेटा में समय शामिल नहीं है (हालांकि SYSDATE करता है):
SQL> select * from test_table;
CREATION_D
----------
2013/04/12
2013/04/12
NLS_DATE_FORMAT को बदलने और उसी चयन को निष्पादित करने पर, अब आपको एक समय घटक मिलता है:
SQL> alter session set nls_date_format = "YYYY/MM/DD HH24:MI:SS";
Session altered.
SQL> select * from test_table;
CREATION_DATE
-------------------
2013/04/12 12:48:41
2013/04/12 12:34:17
अंत में, जब अकेले आज की तारीख का चयन करने का प्रयास किया जाएगा तो कोई पंक्तियाँ वापस नहीं की जाएंगी:
SQL> select *
2 from test_table
3 where creation_date = to_date('20130412','yyyymmdd');
no rows selected
लेकिन, TRUNC()
using का उपयोग करते समय फ़ील्ड के केवल दिनांक भाग की तुलना करने के लिए आपको अपनी सभी पंक्तियाँ फिर से मिलेंगी:
SQL> select *
2 from test_table
3 where trunc(creation_date) = to_date('20130412','yyyymmdd');
CREATION_DATE
-------------------
2013/04/12 12:48:41
2013/04/12 12:34:17
वास्तव में अपने दूसरे प्रश्न का उत्तर देने के लिए, यदि आप अद्वितीय तिथियां चाहते हैं तो आप TRUNC()
का पुन:उपयोग कर सकते हैं समारोह:
select distinct trunc(creation_date)
from test_table