Oracle Database
खजूर
खोज…
बिना समय घटक के साथ दिनांक उत्पन्न करना
सभी DATE
समय घटक है; हालाँकि, यह उन तिथियों को संग्रहीत करने के लिए प्रथागत है जिन्हें समय / मिनट / सेकंड के साथ समय की जानकारी को शून्य (यानी मध्यरात्रि) पर सेट करने की आवश्यकता नहीं है।
ANSI DATE
शाब्दिक का उपयोग करें ( ISO 8601 दिनांक प्रारूप का उपयोग करके):
SELECT DATE '2000-01-01' FROM DUAL;
TO_DATE()
का उपयोग करके इसे स्ट्रिंग शाब्दिक से बदलें:
SELECT TO_DATE( '2001-01-01', 'YYYY-MM-DD' ) FROM DUAL;
( दिनांक प्रारूप मॉडल पर अधिक जानकारी ओरेकल प्रलेखन में पाई जा सकती है।)
या:
SELECT TO_DATE(
'January 1, 2000, 00:00 A.M.',
'Month dd, YYYY, HH12:MI A.M.',
'NLS_DATE_LANGUAGE = American'
)
FROM DUAL;
(यदि आप भाषा के विशिष्ट शब्द जैसे महीने के नाम परिवर्तित कर रहे हैं, तो TO_DATE()
फ़ंक्शन के लिए 3 nlsparam
पैरामीटर को शामिल करना और भाषा को अपेक्षित रूप से निर्दिष्ट करना अच्छा है।)
एक समय घटक के साथ दिनांक बनाना
TO_DATE()
का उपयोग करके इसे स्ट्रिंग शाब्दिक से बदलें:
SELECT TO_DATE( '2000-01-01 12:00:00', 'YYYY-MM-DD HH24:MI:SS' ) FROM DUAL;
या TIMESTAMP
शाब्दिक का उपयोग करें:
CREATE TABLE date_table(
date_value DATE
);
INSERT INTO date_table ( date_value ) VALUES ( TIMESTAMP '2000-01-01 12:00:00' );
ओरेकल एक तालिका के DATE
कॉलम में इसे संग्रहीत करते समय एक DATE
को TIMESTAMP
को निहित करेगा; हालाँकि, आप स्पष्ट रूप से CAST()
DATE
का मान:
SELECT CAST( TIMESTAMP '2000-01-01 12:00:00' AS DATE ) FROM DUAL;
एक तारीख का प्रारूप
Oracle में DATE
डेटा प्रकार का प्रारूप नहीं होता है; जब ओरेकल एक भेजता है DATE
क्लाइंट प्रोग्राम को (SQL / साथ ही, एसक्यूएल / डेवलपर, टॉड, जावा, अजगर, आदि) यह 7- या 8 बाइट्स जो तारीख प्रतिनिधित्व करते हैं भेज देंगे।
एक DATE
जो किसी तालिका में संग्रहीत नहीं है (अर्थात SYSDATE
द्वारा जनरेट किया SYSDATE
और DUMP()
कमांड का उपयोग करते समय "टाइप 13" है जिसमें 8-बाइट्स हैं और संरचना है (दाईं ओर की संख्याएं 2012-11-26 16:41:09
का आंतरिक प्रतिनिधित्व हैं) 2012-11-26 16:41:09
):
BYTE VALUE EXAMPLE
---- ------------------------------- --------------------------------------
1 Year modulo 256 220
2 Year multiples of 256 7 (7 * 256 + 220 = 2012)
3 Month 11
4 Day 26
5 Hours 16
6 Minutes 41
7 Seconds 9
8 Unused 0
एक DATE
जो एक तालिका में संग्रहीत है ("टाइप 12" जब DUMP()
कमांड का उपयोग करते हुए) 7-बाइट्स होते हैं और इसमें संरचना होती है (दाईं ओर संख्याएं 2012-11-26 16:41:09
के आंतरिक प्रतिनिधित्व हैं 2012-11-26 16:41:09
):
BYTE VALUE EXAMPLE
---- ------------------------------- --------------------------------------
1 ( Year multiples of 100 ) + 100 120
2 ( Year modulo 100 ) + 100 112 ((120-100)*100 + (112-100) = 2012)
3 Month 11
4 Day 26
5 Hours + 1 17
6 Minutes + 1 42
7 Seconds + 1 10
यदि आप चाहते हैं कि तिथि एक विशिष्ट प्रारूप हो तो आपको इसे किसी ऐसी चीज़ में बदलना होगा जिसका प्रारूप (यानी एक स्ट्रिंग) है। SQL क्लाइंट ऐसा कर सकता है या आप TO_CHAR( date, format_model, nls_params )
का उपयोग करके स्पष्ट रूप से मान को स्ट्रिंग में बदल सकते हैं।
एक स्ट्रिंग के लिए तिथियाँ परिवर्तित
TO_CHAR( date [, format_model [, nls_params]] )
उपयोग करें TO_CHAR( date [, format_model [, nls_params]] )
(ध्यान दें: यदि एक प्रारूप मॉडल प्रदान नहीं किया गया है, तो NLS_DATE_FORMAT
सत्र पैरामीटर का उपयोग डिफ़ॉल्ट प्रारूप मॉडल के रूप में किया जाएगा; यह हर सत्र के लिए अलग हो सकता है, इसलिए इस पर भरोसा नहीं किया जाना चाहिए। यह प्रारूप मॉडल को हमेशा निर्दिष्ट करने के लिए अच्छा अभ्यास है।)
CREATE TABLE table_name (
date_value DATE
);
INSERT INTO table_name ( date_value ) VALUES ( DATE '2000-01-01' );
INSERT INTO table_name ( date_value ) VALUES ( TIMESTAMP '2016-07-21 08:00:00' );
INSERT INTO table_name ( date_value ) VALUES ( SYSDATE );
फिर:
SELECT TO_CHAR( date_value, 'YYYY-MM-DD' ) AS formatted_date FROM table_name;
आउटपुट:
FORMATTED_DATE
--------------
2000-01-01
2016-07-21
2016-07-21
तथा:
SELECT TO_CHAR(
date_value,
'FMMonth d yyyy, hh12:mi:ss AM',
'NLS_DATE_LANGUAGE = French'
) AS formatted_date
FROM table_name;
आउटपुट:
FORMATTED_DATE
-----------------------------
Janvier 01 2000, 12:00:00 AM
Juillet 21 2016, 08:00:00 AM
Juillet 21 2016, 19:08:31 PM
डिफ़ॉल्ट दिनांक स्वरूप मॉडल सेट करना
जब Oracle TO_CHAR()
रूप से DATE
से एक स्ट्रिंग या इसके विपरीत (या जब TO_CHAR()
या TO_DATE()
को स्पष्ट रूप से एक प्रारूप मॉडल के बिना कहा जाता है) में NLS_DATE_FORMAT
हो जाता है, तो NLS_DATE_FORMAT
सत्र पैरामीटर का उपयोग रूपांतरण प्रारूप में प्रारूप मॉडल के रूप में किया जाएगा। यदि शाब्दिक प्रारूप मॉडल से मेल नहीं खाता है, तो एक अपवाद उठाया जाएगा।
आप इस पैरामीटर की समीक्षा कर सकते हैं:
SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT';
आप अपने वर्तमान सत्र के भीतर इस मान को सेट कर सकते हैं:
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
(नोट: यह किसी भी अन्य उपयोगकर्ताओं के लिए मूल्य नहीं बदलता है।)
यदि आप TO_DATE()
या TO_CHAR()
में प्रारूप मुखौटा प्रदान करने के लिए NLS_DATE_FORMAT
पर भरोसा करते हैं, तो आपको आश्चर्यचकित नहीं होना चाहिए कि जब आपके प्रश्न इस मूल्य को कभी बदलते हैं तो वे टूट जाते हैं।
SQL / Plus या SQL डेवलपर प्रदर्शन दिनांक कैसे परिवर्तित करें
जब एसक्यूएल / प्लस या एसक्यूएल डेवलपर तारीखों को प्रदर्शित करते हैं, तो वे डिफ़ॉल्ट तिथि प्रारूप मॉडल का उपयोग करके स्ट्रिंग में एक अंतर्निहित रूपांतरण करेंगे ( डिफ़ॉल्ट तिथि प्रारूप मॉडल उदाहरण सेटिंग देखें)।
आप बदल सकते हैं कि NLS_DATE_FORMAT
पैरामीटर को बदलकर एक तिथि कैसे प्रदर्शित की जाती है।
तिथि अंकगणित - दिन, घंटे, मिनट और / या सेकंड में तिथियों के बीच अंतर
ओरेकल में, दो DATE
s के बीच अंतर (दिनों और / या अंशों में) घटाव का उपयोग करके पाया जा सकता है:
SELECT DATE '2016-03-23' - DATE '2015-12-25' AS difference FROM DUAL;
दो तिथियों के बीच दिनों की संख्या को आउटपुट करता है:
DIFFERENCE
----------
89
तथा:
SELECT TO_DATE( '2016-01-02 01:01:12', 'YYYY-MM-DD HH24:MI:SS' )
- TO_DATE( '2016-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS' )
AS difference
FROM DUAL
दो दिनों के बीच दिनों के अंश को आउटपुट करता है:
DIFFERENCE
----------
1.0425
इस संख्या को क्रमशः 24
, 24*60
या 24*60*60
से गुणा करके घंटे, मिनट या सेकंड में अंतर पाया जा सकता है।
पिछले उदाहरण को दो तिथियों के बीच दिन, घंटे, मिनट और सेकंड प्राप्त करने के लिए बदला जा सकता है:
SELECT TRUNC( difference ) AS days,
TRUNC( MOD( difference * 24, 24 ) ) AS hours,
TRUNC( MOD( difference * 24*60, 60 ) ) AS minutes,
TRUNC( MOD( difference * 24*60*60, 60 ) ) AS seconds
FROM (
SELECT TO_DATE( '2016-01-02 01:01:12', 'YYYY-MM-DD HH24:MI:SS' )
- TO_DATE( '2016-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS' )
AS difference
FROM DUAL
);
(नोट: TRUNC()
का उपयोग FLOOR()
बजाय नकारात्मक अंतरों को सही ढंग से संभालने के लिए किया जाता है।)
आउटपुट:
DAYS HOURS MINUTES SECONDS
---- ----- ------- -------
1 1 1 12
पिछले उदाहरण को NUMTODSINTERVAL()
का उपयोग करके संख्यात्मक अंतर को अंतराल में परिवर्तित करके भी हल किया जा सकता है:
SELECT EXTRACT( DAY FROM difference ) AS days,
EXTRACT( HOUR FROM difference ) AS hours,
EXTRACT( MINUTE FROM difference ) AS minutes,
EXTRACT( SECOND FROM difference ) AS seconds
FROM (
SELECT NUMTODSINTERVAL(
TO_DATE( '2016-01-02 01:01:12', 'YYYY-MM-DD HH24:MI:SS' )
- TO_DATE( '2016-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS' ),
'DAY'
) AS difference
FROM DUAL
);
तिथि अंकगणित - महीनों या वर्षों में तिथियों के बीच का अंतर
MONTHS_BETWEEN( date1, date2 )
का उपयोग करके दो तिथियों के बीच के महीनों में अंतर पाया जा सकता है:
SELECT MONTHS_BETWEEN( DATE '2016-03-10', DATE '2015-03-10' ) AS difference FROM DUAL;
आउटपुट:
DIFFERENCE
----------
12
यदि अंतर में भाग के महीने शामिल हैं तो यह महीने के उस हिस्से को लौटा देगा, जिसके आधार पर प्रत्येक महीने में 31 दिन होंगे:
SELECT MONTHS_BETWEEN( DATE '2015-02-15', DATE '2015-01-01' ) AS difference FROM DUAL;
आउटपुट:
DIFFERENCE
----------
1.4516129
MONTHS_BETWEEN
प्रति माह 31 दिन MONTHS_BETWEEN
कारण जब प्रति माह कम दिन हो सकते हैं, तो इसके परिणामस्वरूप विभिन्न अंतर हो सकते हैं, जो महीनों के बीच की सीमाओं को MONTHS_BETWEEN
।
उदाहरण:
SELECT MONTHS_BETWEEN( DATE'2016-02-01', DATE'2016-02-01' - INTERVAL '1' DAY ) AS "JAN-FEB",
MONTHS_BETWEEN( DATE'2016-03-01', DATE'2016-03-01' - INTERVAL '1' DAY ) AS "FEB-MAR",
MONTHS_BETWEEN( DATE'2016-04-01', DATE'2016-04-01' - INTERVAL '1' DAY ) AS "MAR-APR",
MONTHS_BETWEEN( DATE'2016-05-01', DATE'2016-05-01' - INTERVAL '1' DAY ) AS "APR-MAY"
FROM DUAL;
आउटपुट:
JAN-FEB FEB-MAR MAR-APR APR-MAY
------- ------- ------- -------
0.03226 0.09677 0.03226 0.06452
महीनों के अंतर को 12 से विभाजित करके वर्षों में अंतर पाया जा सकता है।
वर्ष, महीना, दिन, घंटा, मिनट या दिनांक के दूसरे घटक निकालें
वर्ष, माह या दिन एक के घटकों DATE
डेटा प्रकार का उपयोग कर पाया जा सकता है EXTRACT( [ YEAR | MONTH | DAY ] FROM datevalue )
SELECT EXTRACT (YEAR FROM DATE '2016-07-25') AS YEAR,
EXTRACT (MONTH FROM DATE '2016-07-25') AS MONTH,
EXTRACT (DAY FROM DATE '2016-07-25') AS DAY
FROM DUAL;
आउटपुट:
YEAR MONTH DAY
---- ----- ---
2016 7 25
समय (घंटा, मिनट या दूसरा) घटक या तो मिल सकते हैं:
-
DATE
कोTIMESTAMP
परिवर्तित करने के लिएCAST( datevalue AS TIMESTAMP )
का उपयोग करना और फिरEXTRACT( [ HOUR | MINUTE | SECOND ] FROM timestampvalue )
का उपयोग करके। या - स्ट्रिंग के रूप में मान प्राप्त करने के लिए
TO_CHAR( datevalue, format_model )
का उपयोग करना।
उदाहरण के लिए:
SELECT EXTRACT( HOUR FROM CAST( datetime AS TIMESTAMP ) ) AS Hours,
EXTRACT( MINUTE FROM CAST( datetime AS TIMESTAMP ) ) AS Minutes,
EXTRACT( SECOND FROM CAST( datetime AS TIMESTAMP ) ) AS Seconds
FROM (
SELECT TO_DATE( '2016-01-01 09:42:01', 'YYYY-MM-DD HH24:MI:SS' ) AS datetime FROM DUAL
);
आउटपुट:
HOURS MINUTES SECONDS
----- ------- -------
9 42 1
समय क्षेत्र और डेलाइट बचत समय
DATE
डेटा प्रकार, समय क्षेत्र या दिन की बचत समय में परिवर्तन को नहीं संभालता है।
कोई एक:
-
TIMESTAMP WITH TIME ZONE
डेटा प्रकार केTIMESTAMP WITH TIME ZONE
उपयोग करें; या - अपने एप्लिकेशन लॉजिक में परिवर्तनों को संभालें।
एक DATE
को समन्वित यूनिवर्सल टाइम (UTC) के रूप में संग्रहीत किया जा सकता है और वर्तमान सत्र समय क्षेत्र में इस तरह परिवर्तित किया जा सकता है:
SELECT FROM_TZ(
CAST(
TO_DATE( '2016-01-01 12:00:00', 'YYYY-MM-DD HH24:MI:SS' )
AS TIMESTAMP
),
'UTC'
)
AT LOCAL AS time
FROM DUAL;
यदि आप ALTER SESSION SET TIME_ZONE = '+01:00';
फिर आउटपुट है:
TIME
------------------------------------
2016-01-01 13:00:00.000000000 +01:00
और ALTER SESSION SET TIME_ZONE = 'PST';
फिर आउटपुट है:
TIME
------------------------------------
2016-01-01 04:00:00.000000000 PST
लीप सेकंड
ओरेकल लीप सेकंड को हैंडल नहीं करता है । अधिक जानकारी के लिए मेरा ओरेकल सपोर्ट नोट 2019397.2
और 730795.1
देखें।
सप्ताह का दिन हो रहा है
सप्ताह के दिन प्राप्त करने के लिए आप TO_CHAR( date_value, 'D' )
का उपयोग कर सकते हैं।
हालाँकि, यह NLS_TERRITORY
सत्र पैरामीटर पर निर्भर है:
ALTER SESSION SET NLS_TERRITORY = 'AMERICA'; -- First day of week is Sunday
SELECT TO_CHAR( DATE '1970-01-01', 'D' ) FROM DUAL;
आउटपुट 5
ALTER SESSION SET NLS_TERRITORY = 'UNITED KINGDOM'; -- First day of week is Monday
SELECT TO_CHAR( DATE '1970-01-01', 'D' ) FROM DUAL;
आउटपुट 4
NLS
सेटिंग्स के इस स्वतंत्र करने के लिए, आप वर्तमान दिन की मध्यरात्रि (दिन के किसी भी अंश को हटाने के लिए) को काट सकते हैं और वर्तमान आइसो-सप्ताह (जो हमेशा सोमवार से शुरू होता है) की शुरुआत में काटे गए दिनांक को घटा सकते हैं:
SELECT TRUNC( date_value ) - TRUNC( date_value, 'IW' ) + 1 FROM DUAL