2010-01-13 13 views
5

मेरे पास मेरे एसक्यूएल सर्वर 2005 तालिका में एक कॉलम है जो कि कर्मचारी द्वारा सेवा में महीनों की संख्या होनी चाहिए।एसक्यूएल सर्वर 2005 में दो तिथियों के बीच महीनों की संख्या कैसे प्राप्त करें

चूंकि मेरे पास कर्मचारी की तारीख भी थी, इसलिए मुझे "months_In_Service" कॉलम एक गणना कॉलम होना चाहिए।

अब अगर मैं DATEDIFF(month,[DateEngaged],GETDATE()) सेवा गणना कॉलम में महीनों के सूत्र के रूप में उपयोग करता हूं, तो परिणाम कुछ बार और अन्य बार गलत होते हैं।

दिनांकित मूल्य और वर्तमान तिथि के बीच महीनों की संख्या प्राप्त करने का बेहतर विश्वसनीय तरीका क्या होगा? मेरे गणना कॉलम में मुझे किस सूत्र का उपयोग करना चाहिए?

+0

क्या आप कह सकते हैं कि कभी-कभी वे सही होते हैं और कभी-कभी आप क्या कहते हैं इसका कुछ उदाहरण प्रदान कर सकते हैं imes वे नहीं हैं। –

+0

क्या आप इसे रीटैग कर सकते हैं (संपादित करें) और एसक्यूएल-सर्वर-2005 (या यहां तक ​​कि केवल एसक्यूएल-सर्वर) सेट करें? डैश नोट करें। यहां ऐसे उपयोगकर्ता हैं जो SQL सर्वर प्रश्नों (उनकी विशेषज्ञता नहीं) को अनदेखा करते हैं लेकिन SQL प्रश्नों में रूचि रखते हैं। –

+0

DateEngaged = '12/20/200 9 " CurrentDate = '1/13/2010" यह मुझे फॉर्मुलर "डेटिफ़ (महीने, [दिनांकित], getdate() + (1)) का उपयोग करके 1 सेवा के रूप में सेवा देता है।" यह फॉर्मूला "वर्ष (दिनांक, [दिनांकित], getdate() + (1))" – StackTrace

उत्तर

12

कुछ की तरह (1 और 0, अपरीक्षित स्वैप करने के लिए आवश्यकता हो सकती है)

datediff(month,[DateEngaged],getdate()) + 
CASE WHEN DATEPART(day, [DateEngaged]) < DATEPART(day, getdate()) THEN 1 ELSE 0 END 

DateDiff उपाय महीने सीमाओं प्रत्येक महीने की 1 को 00:00 समय जैसे, नहीं के दिन के अनुसार महीने वर्षगाँठ

संपादित करें: ओपी की टिप्पणी को देखने के बाद, आप 1 घटाना अगर 13 जनवरी के लिए 20 दिसंबर प्रारंभ दिन> अंत दिन

DATEDIFF (month, DateEngaged, getdate()) - 
CASE 
    WHEN DATEPART(day, DateEngaged) > DATEPART(day, getdate()) THEN 1 ELSE 0 
END 

तो, DateDiff 1 देता है और फिर 20> 13 इसलिए घटाना 1 = शून्य मोन है चौथाई।

+0

यह सही तरीके से काम करता प्रतीत होता है, बस इसे मामले में और अधिक परीक्षण करने जा रहा हूं। – StackTrace

+1

क्या आपने कभी परीक्षण किया था जब कर्मचारी 31 अक्टूबर को व्यस्त था और वर्तमान तिथि 30 नवंबर थी? यह दिनचर्या 0 महीने लौटाती है, लेकिन असल में, लगभग हर व्यावसायिक आवश्यकता जिसे मैं कल्पना कर सकता हूं, कहूंगा कि यह एक महीना है। यह उस समस्या के समाधान की तलाश में पाया। अभी भी देख रहे हैं ...... – Ron

+0

@Ron क्या समझा रहा है के लिए एक शानदार समाधान नहीं है? – toscanelli

1

शायद तुम कुछ की तरह हैं:

(year(getdate())-year([DateEngaged]))*12+(month(getdate())-month([DateEngaged])) 
-2

यदि आप लगता है कि महीने के 30 दिनों के लिए जिसका अर्थ है आप भी दौर कर सकते हैं घाटी

round((datediff(day,[DateEngaged],getdate()))/30.00,0) 
+0

मैं वास्तव में 30 दिनों का मतलब चाहता हूं और 30 दिनों के बारह महीने (प्रत्येक !!) का मतलब है। – StackTrace

+5

यह समय आगे बढ़ने के साथ आगे और आगे बढ़ता है। 6 साल बाद, त्रुटि एक पूरे महीने है, गारंटी है – gbn

4

एक ही दृष्टिकोण GBN के रूप में, लेकिन कम कीस्ट्रोक्स के साथ: -)

SELECT 
    DATEDIFF(MONTH, DateEngaged, GETDATE()) + 
    CASE 
     WHEN DAY(DateEngaged) < DAY(GETDATE()) 
     THEN 1 
     ELSE 0 
    END 
संबंधित मुद्दे

 संबंधित मुद्दे