2008-09-04 17 views
5

के बराबर बराबर है, अब हम अपने सॉफ्टवेयर स्थापित होने पर विभिन्न डेटाबेस बेस से कनेक्ट करने के लिए एनएचबीर्नेट का उपयोग कर रहे हैं। तो मैं ओरेकल को कई एसक्यूएल प्रक्रियाओं को पोर्ट कर रहा हूं।ओरेकल एसक्यूएल सर्वर/साइबेस डेटडिफ

SQL सर्वर का डेटफिफ़ नामक एक अच्छा फ़ंक्शन है जो दिनांक भाग, स्टार्टडेट और समाप्ति लेता है।

दिनांक भागों उदाहरण दिन, सप्ताह, महीने, वर्ष, आदि हैं। ।

ओरेकल समकक्ष क्या है?

मुझे कोई नहीं मिला है कि मुझे इसका अपना संस्करण बनाना है?

(मार्क हैरिसन द्वारा अपडेट) ओरेकल दिनांक अंकगणित समझाते हुए कई अच्छे उत्तर हैं। यदि आपको ओरेकल डेटीफ की आवश्यकता है() आइंस्टीन के जवाब देखें। (मुझे साइबेस और ओरेकल के बीच स्पैम एसक्यूएल स्क्रिप्ट को संगत रखने के लिए इसकी आवश्यकता है।) ध्यान दें कि यह प्रश्न साइबेस के लिए समान रूप से लागू होता है।

+0

यहाँ एक नज़र: (यदि यह लिंक अभी भी रॉट किया गया है, तो नीचे दिए गए एक का उपयोग करें) http://asktom.oracle.com/pls/asktom/ASKTOM.download_file?p_file=6551242712657900129 –

उत्तर

1

टॉम का लेख बहुत पुराना है। यह केवल DATE के प्रकार पर चर्चा करता है। यदि आप TIMESTAMP प्रकारों का उपयोग करते हैं तो दिनांक अंकगणित पीएल/एसक्यूएल में बनाया गया है।

http://www.akadia.com/services/ora_date_time.html

DECLARE 
ts_a timestamp; 
ts_b timestamp; 
diff interval day to second; 
BEGIN 
    ts_a := systimestamp; 
    ts_b := systimestamp-1/24; 
    diff := ts_a - ts_b; 
    dbms_output.put_line(diff); 
END; 
+00 01:00:00.462000 

या

DECLARE 
ts_b timestamp; 
ts_a timestamp; 
date_part interval day to second; 

BEGIN 
    ts_a := systimestamp; 
    date_part := to_dsinterval('0 01:23:45.678'); 
    ts_b := ts_a + date_part; 
    dbms_output.put_line(ts_b); 
END; 

04-SEP-08 05.00.38.108000 PM 
4

JohnLavoie - आपको लगता है कि जरूरत नहीं है। ओरेकल में DATE वास्तव में एक दिनांक और समय डेटा प्रकार है। DATE और TIMESTAMP के बीच एकमात्र अंतर यह है कि DATE को दूसरे स्थान पर हल किया जाता है लेकिन TIMESTAMP माइक्रो सेकेंड तक हल हो जाता है। इसलिए पूछें टॉम आलेख TIMESTAMP कॉलम के लिए भी पूरी तरह मान्य है।

4

मैंने कुछ साल पहले पुराने टॉम लेख से इसे चुरा लिया, लेख से कुछ बग तय कर दिए और इसे साफ़ कर दिया। डेटीफ के लिए सीमांकन लाइनों को ऑरैकल और एमएसएसक्यूएल के बीच अलग-अलग गणना की जाती है, इसलिए आपको वहां के आसपास तैरने वाले कुछ उदाहरणों से सावधान रहना होगा जो एमएसएसएलएल/साइबेस शैली की सीमाओं के लिए उचित रूप से खाते नहीं हैं जो आंशिक परिणाम प्रदान नहीं करते हैं।

निम्नलिखित के साथ आप एमएसएसएलएल सिंटैक्स का उपयोग करने में सक्षम होना चाहिए और एमयूएसक्यूएल जैसे एसईएलटी डेटाडिफ़ (डीडी, गेटडेट(), DATEADD (डीडी, 5, गेटडेट()) के समान परिणाम प्राप्त कर सकते हैं) डुएल से;

मैं केवल दावा करता हूं कि यह काम करता है - यह नहीं कि इसका प्रभावशाली या ऐसा करने का सबसे अच्छा तरीका है। मैं ओरेकल व्यक्ति नहीं हूं :) और आप डीडी, मिमी, एचएच, मील..एटीसी के आसपास उद्धरणों की आवश्यकता के लिए मेरे फ़ंक्शन मैक्रोज़ का उपयोग करने के बारे में दो बार सोचना चाहेंगे।

(मार्क हैरिसन द्वारा अपडेट) डीडी के लिए उपनाम के रूप में जोड़ा गया कार्य।

CREATE OR REPLACE FUNCTION GetDate 
RETURN date IS today date; 
BEGIN 
RETURN(sysdate); 
END; 
/

CREATE OR REPLACE FUNCTION mm RETURN VARCHAR2 IS BEGIN RETURN('mm'); END; 
/
CREATE OR REPLACE FUNCTION yy RETURN VARCHAR2 IS BEGIN RETURN('yyyy'); END; 
/
CREATE OR REPLACE FUNCTION dd RETURN VARCHAR2 IS BEGIN RETURN('dd'); END; 
/
CREATE OR REPLACE FUNCTION dy RETURN VARCHAR2 IS BEGIN RETURN('dd'); END; 
/
CREATE OR REPLACE FUNCTION hh RETURN VARCHAR2 IS BEGIN RETURN('hh'); END; 
/
CREATE OR REPLACE FUNCTION mi RETURN VARCHAR2 IS BEGIN RETURN('mi'); END; 
/
CREATE OR REPLACE FUNCTION ss RETURN VARCHAR2 IS BEGIN RETURN('ss'); END; 
/

CREATE OR REPLACE Function DateAdd(date_type IN varchar2, offset IN integer, date_in IN date) 
RETURN date IS date_returned date; 
BEGIN 
date_returned := CASE date_type 
    WHEN 'mm' THEN add_months(date_in,TRUNC(offset)) 
    WHEN 'yyyy' THEN add_months(date_in,TRUNC(offset) * 12) 
    WHEN 'dd' THEN date_in + TRUNC(offset) 
    WHEN 'hh' THEN date_in + (TRUNC(offset)/24) 
    WHEN 'mi' THEN date_in + (TRUNC(offset) /24/60) 
    WHEN 'ss' THEN date_in + (TRUNC(offset) /24/60/60) 
    END; 
RETURN(date_returned); 
END; 
/

CREATE OR REPLACE Function DateDiff(return_type IN varchar2, date_1 IN date, date_2 IN date) 
RETURN integer IS number_return integer; 
BEGIN 
number_return := CASE return_type 
    WHEN 'mm' THEN ROUND(MONTHS_BETWEEN(TRUNC(date_2,'MM'),TRUNC(date_1, 'MM'))) 
    WHEN 'yyyy' THEN ROUND(MONTHS_BETWEEN(TRUNC(date_2,'YYYY'), TRUNC(date_1, 'YYYY')))/12 
    WHEN 'dd' THEN ROUND((TRUNC(date_2,'DD') - TRUNC(date_1, 'DD'))) 
    WHEN 'hh' THEN (TRUNC(date_2,'HH') - TRUNC(date_1,'HH')) * 24 
    WHEN 'mi' THEN (TRUNC(date_2,'MI') - TRUNC(date_1,'MI')) * 24 * 60 
    WHEN 'ss' THEN (date_2 - date_1) * 24 * 60 * 60 
    END; 
RETURN(number_return); 
END; 
/
0

आप इस

function  datediff(p_what in varchar2, p_d1 in date, p_d2 in date) return number as l_result number; 
BEGIN 
     select (p_d2-p_d1) * 
      decode(upper(p_what), 'SS', 24*60*60, 'MI', 24*60, 'HH', 24, NULL) 
     into l_result from dual; 

     return l_result; 
END; 

के लिए ओरेकल में एक समारोह लिख सकते हैं और यह पसंद का उपयोग किया जा सका:

DATEDIFF('YYYY-MM-DD', SYSTIMESTAMP, SYSTIMESTAMP) 
संबंधित मुद्दे