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

दिनांक तुलना असामान्य परिणाम देता है - SQL Oracle

यह मेरे लिए उचित . के साथ पूरी तरह से काम करता है TO_DATE . का उपयोग और DATE मान।

  • कभी भी TO_DATE का उपयोग न करें एक दिनांक . को , यह अंतर्निहित रूप से इसे स्ट्रिंग में रूपांतरित कर देगा और फिर स्थानीय-विशिष्ट NLS प्रारूप का उपयोग करके तारीख तक वापस कर देगा

  • '01/01/2015' DATE नहीं है, यह STRING है। आपको TO_DATE . का उपयोग करना चाहिए इसे स्पष्ट रूप से DATE में बदलने के लिए।

देखें क्या होता है:

SQL> explain plan for select * from dual where to_date(sysdate) > to_date(sysdate -1);

Explained.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3752461848

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     1 |     2 |     2   (0)| 00:00:01 |
|*  1 |  FILTER            |      |       |       |            |          |
|   2 |   TABLE ACCESS FULL| DUAL |     1 |     2 |     2   (0)| 00:00:01 |
---------------------------------------------------------------------------

Predicate Information (identified by operation id):

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
---------------------------------------------------

   1 - filter(TO_DATE(TO_CHAR([email protected]!))>TO_DATE(TO_CHAR([email protected]!-1)))

14 rows selected.

SQL>

इसलिए, लागू किया गया वास्तविक फ़िल्टर filter(TO_DATE(TO_CHAR([email protected] है। !)) स्थानीय-विशिष्ट एनएलएस प्रारूप के आधार पर निहित रूपांतरण के कारण आपको गलत आउटपुट मिलेगा।

बहरहाल, अब वापस अपने मूल प्रश्न पर आते हैं।

उदाहरण के लिए,

मान लें कि आपका डेटा ऐसा दिखता है:

सेटअप:

SQL> CREATE TABLE t
  2      (week_no VARCHAR2(2), long_week_no VARCHAR2(2), week_start_date DATE, week_end_date DATE, mnth VARCHAR2(3), yr VARCHAR2(4))
  3  ;

Table created.

SQL>
SQL>
SQL> INSERT ALL
  2      INTO t (week_no, long_week_no, week_start_date, week_end_date, mnth, yr)
  3           VALUES ('1', '1A', TO_DATE('01/01/2015','DD/MM/YYYY'), TO_DATE('03/01/2015','DD/MM/YYYY'), 'JAN', '2015')
  4      INTO t (week_no, long_week_no, week_start_date, week_end_date, mnth, yr)
  5           VALUES ('1', '1B', TO_DATE('04/01/2015','DD/MM/YYYY'), TO_DATE('10/01/2015','DD/MM/YYYY'), 'JAN', '2015')
  6      INTO t (week_no, long_week_no, week_start_date, week_end_date, mnth, yr)
  7           VALUES ('2', '2', TO_DATE('11/01/2015','DD/MM/YYYY'), TO_DATE('17/01/2015','DD/MM/YYYY'), 'JAN', '2015')
  8      INTO t (week_no, long_week_no, week_start_date, week_end_date, mnth, yr)
  9           VALUES ('3', '3', TO_DATE('18/01/2015','DD/MM/YYYY'), TO_DATE('24/01/2015','DD/MM/YYYY'), 'JAN', '2015')
 10      INTO t (week_no, long_week_no, week_start_date, week_end_date, mnth, yr)
 11           VALUES ('51', '51', TO_DATE('20/12/2014','DD/MM/YYYY'), TO_DATE('26/12/2015','DD/MM/YYYY'), 'DEC', '2014')
 12  SELECT * FROM dual
 13  ;

5 rows created.

SQL>
SQL> COMMIT;

Commit complete.

SQL>

तालिका:

SQL> SELECT * FROM t;

WE LO WEEK_STAR WEEK_END_ MNT YR
-- -- --------- --------- --- ----
1  1A 01-JAN-15 03-JAN-15 JAN 2015
1  1B 04-JAN-15 10-JAN-15 JAN 2015
2  2  11-JAN-15 17-JAN-15 JAN 2015
3  3  18-JAN-15 24-JAN-15 JAN 2015
51 51 20-DEC-14 26-DEC-15 DEC 2014

SQL>

DATE की सीमा के आधार पर पंक्तियों को फ़िल्टर करने की क्वेरी:

SQL> SELECT *
  2  FROM   t
  3  WHERE  To_date('15/01/2015', 'DD/MM/YYYY') BETWEEN
  4         week_start_date AND
  5         week_end_date;

WE LO WEEK_STAR WEEK_END_ MNT YR
-- -- --------- --------- --- ----
2  2  11-JAN-15 17-JAN-15 JAN 2015
51 51 20-DEC-14 26-DEC-15 DEC 2014

SQL>



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. pl sql में स्ट्रिंग को टोकन में विभाजित करें

  2. एसक्यूएल का उपयोग करके लापता तिथियां खोजें

  3. ओरेकल डेटाबेस:वर्णों द्वारा एक स्ट्रिंग को विभाजित करें

  4. पृष्ठ आइटम को अद्यतन करने वाली गतिशील क्रियाओं के लिए Oracle APEX 18.1.0.00.45 पर सत्र स्थिति सुरक्षा अक्षम नहीं कर सकता

  5. Oracle सन्निहित दिनांक ब्लॉक द्वारा डेटा का चयन करता है