2012-11-06 11 views
5

आज की तारीख मैं इस का उपयोग हो रही है के लिए ..Oracle SQL, कैसे आज की तारीख का उपयोग करने - एक निर्धारित तिथि

select extract(year from sysdate) from dual; 

तारीख मेरी डेटाबेस पकड़ मैं इस का उपयोग करें कि हो रही है के लिए ..

select extract(year from startdate) from staff; 

लेकिन अब मैं, स्टाफ के अंदर एक क्षेत्र कॉल serviceYears अद्यतन करने के लिए कोशिश कर रहा हूँ

current year - year of start date

का उपयोग करके

कर्मचारियों ने काम करने के लिए प्रतिबद्ध वर्षों की मात्रा प्राप्त करने के लिए। कैसे मैं इसे प्राप्त है ..

मैं Oracle SQL का उपयोग कर रहा

धन्यवाद!

मैं

SQL> select dual.sysdate-staff.startdatefrom dual,staff; 

select dual.sysdate-staff.startdatefrom from dual,staff 
      * 
ERROR at line 1: 
ORA-01747: invalid user.table.column, table.column, or column specification 

मैं भी कोशिश की

select SYSDATE-to_date('01-jan-2007','dd-mon-yyyy') from dual; 

But it return me 
SYSDATE-TO_DATE('01-JAN-2007','DD-MON-YYYY') 
-------------------------------------------- 
            2136.93719 

कैसे मैं सिर्फ साल मिलता है का उपयोग करने की कोशिश की?

+1

"सेवा वर्ष" एक पूर्णांक होना चाहिए? यानी यदि एक कर्मचारी सदस्य ने 6 साल 1 महीने काम किया है तो आप क्या चाहते हैं और 6 साल 11 महीने के बारे में क्या? यह भी दृश्य/वर्चुअल कॉलम के रूप में बेहतर होगा क्योंकि डेटा को हर समय बनाए रखने की आवश्यकता होगी। – DazzaL

उत्तर

8

आप क्या कर सकते हैं इस

UPDATE STAFF 
SET serviceYear = ROUND((sysdate - startDate)/365) 

पूर्व:

select ROUND((sysdate - to_date('01-JAN-2007','DD-MON-YYYY'))/365) 
from dual; -- returns 6 


select ROUND((sysdate - to_date('01-JAN-2005','DD-MON-YYYY'))/365,2) 
from dual; -- returns 7.85 

अपडेट किया गया:

SELECT 
FLOOR((SYSDATE - TO_DATE('01-JAN-2005','DD-MON-YYYY'))/365) YEARDOWN, 
CEIL((SYSDATE - TO_DATE('01-JAN-2005','DD-MON-YYYY'))/365) YearUP 
FROM DUAL; 
+0

मैं इसके बजाय कैसे गोल करूं, क्योंकि कुछ कार्यकर्ता मुझे वर्ष 2005 से काम शुरू करते हैं, लेकिन यह सेवा वर्ष 8 के रूप में गिनता है, जबकि अब केवल वर्ष 2012 है। जैसे कि यह स्टार्टडेट 01-जनवरी-05, लेकिन सेवा की लंबाई 8 – user1777711

+0

मेरा अद्यतन उत्तर –

+0

दिनों की संख्या के आधार पर काम किए गए वर्षों की संख्या को देखने पर उत्सुक नहीं है - महीनों_बेटवीन() एक बेहतर विकल्प होगा, मुझे लगता है। –

1

आपको dual.sysdate की आवश्यकता नहीं है - आप केवल sysdate का संदर्भ दे सकते हैं।

select sysdate-staff.startdatefrom from staff 
+0

मुझे साल में जवाब कैसे प्राप्त होता है :) – user1777711

+0

यह दिनों में होगा - इसलिए आप (अंशकालिक) वर्ष प्राप्त करने के लिए 365 तक विभाजित करेंगे। तो आप गोल कर सकते हैं। – Randy

1

मुझे लगता है कि आपको FLOOR और MONTHS_BETWEEN के संयोजन द्वारा बेहतर सेवा दी जा सकती है।

SQL> CREATE TABLE t (start_date DATE); 

Table created. 

SQL> INSERT INTO t VALUES (TO_DATE('20070930','YYYYMMDD')); 

1 row created. 

SQL> SELECT FLOOR(MONTHS_BETWEEN(TRUNC(SYSDATE), start_date)/12) yrs_between_start_dt_and_today FROM t 
    2 ; 

YRS_BETWEEN_START_DT_AND_TODAY 
------------------------------ 
          5 

SQL> 

आप आवश्यकतानुसार अपने राउंडिंग को समायोजित कर सकते हैं। इसके अलावा, यह समाधान लीप वर्षों के साथ बेहतर होता है और इस तरह, हार्ड-कोडित 365 द्वारा विभाजित करने की तुलना में।

+0

हाँ, माह-आधारित समाधान के लिए +1। –

-1
SELECT extract(year from sysdate)-extract(year from TDATE) 
     FROM R_M 
CONNECT BY LEVEL <=1 
संबंधित मुद्दे