MySQL

2011-04-12 4 views
6

मैं एक MySQL तालिका में दो स्तंभ होने में महीनों में दो दिनांकों के बीच अंतर की गणना कैसे करें:MySQL

  • DateOfService (दिनांक)
  • जन्मतिथि (तारीख)

मैं चलाना चाहते हैं एक MySQL क्वेरी जो महीनों में इन दो क्षेत्रों के बीच दिनांक अंतर प्रदान करेगी।

मैं इसे MySQL चुनिंदा क्वेरी में कैसे कर सकता हूं?

धन्यवाद।

+0

क्या आप एक उदाहरण दे सकते हैं कि आप किस आउटपुट की अपेक्षा करते हैं? उदा।: आज 12 अप्रैल है और मेरा जन्मदिन 14 अप्रैल या 12 मई या 15 मई है। आप क्वेरी से क्या मूल्य प्राप्त करने की उम्मीद करेंगे? – Teetrinker

+0

डुप्लिकेट: http://stackoverflow.com/questions/288984/the-difference-in-months-between-dates-in-mysql – manji

+0

DateOfService कॉलम दिनांक हमेशा जन्मदिन कॉलम से अधिक होगा। इसलिए मुझे DateOfService से जन्मदिन घटाएं और महीनों में अंतर की गणना करें। – Awan

उत्तर

8

यह काम कर सकता था:

SELECT 12 * (YEAR(DateOfService) 
       - YEAR(BirthDate)) 
     + (MONTH(DateOfService) 
      - MONTH(BirthDate)) AS months 
FROM table 
+0

मैंने इस क्वेरी का उपयोग किया है .. जारी विशेष तिथि उत्पन्न होती है। तारीख 2014-01-30 से 2014-03-02 केवल 30 दिन अलग है। लेकिन यह 2 महीने का अंतर देता है। – Vaishu

+0

@jey: तकनीकी रूप से वे एक-दूसरे से दूर हैं ... – Marco

3

इस प्रयास करें:

SELECT DATEDIFF(DateOfService, BirthDate)/30 as months FROM ...

40

MySQL में TIMESTAMPDIFF() समारोह पर एक नज़र डालें।

इस तुम क्या करने की अनुमति देता है क्या दो TIMESTAMP या DATETIME मूल्यों (या यहां तक ​​कि DATE MySQL के रूप में होगा स्वतः-रूपांतरण) में पारित करने के साथ ही आप अपने अंतर का आधार चाहता हूँ समय की इकाई है।

आप पहले पैरामीटर में इकाई के रूप में MONTH निर्दिष्ट कर सकते हैं:

SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-04') 
-- 0 

SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-05') 
-- 1 

SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-15') 
-- 1 

SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-12-16') 
-- 7 

यह मूल रूप से की संख्या हो जाता है पैरामीटर सूची में पहली तारीख से महीने बीत चुके हैं। यह समाधान प्रत्येक महीने (28,30,31) के साथ-साथ लीप वर्षों में अलग-अलग दिनों के लिए खाता है।


आप गुजरे महीनों की संख्या में दशमलव परिशुद्धता चाहते हैं, यह एक छोटे और अधिक जटिल है, लेकिन यहां कैसे आप यह कर सकते है:

SELECT 
    TIMESTAMPDIFF(MONTH, startdate, enddate) + 
    DATEDIFF(
    enddate, 
    startdate + INTERVAL 
     TIMESTAMPDIFF(MONTH, startdate, enddate) 
    MONTH 
)/
    DATEDIFF(
    startdate + INTERVAL 
     TIMESTAMPDIFF(MONTH, startdate, enddate) + 1 
    MONTH, 
    startdate + INTERVAL 
     TIMESTAMPDIFF(MONTH, startdate, enddate) 
    MONTH 
) 

कहाँ startdate और enddate अपनी तिथि मापदंड हैं, यह है कि क्या एक स्क्रिप्ट से एक मेज इनपुट पैरामीटर में या के रूप में दो तारीख स्तंभों से हो:

उदाहरण:

With startdate = '2012-05-05' AND enddate = '2012-05-27': 
-- Outputs: 0.7097 

With startdate = '2012-05-05' AND enddate = '2012-06-13': 
-- Outputs: 1.2667 

With startdate = '2012-02-27' AND enddate = '2012-06-02': 
-- Outputs: 3.1935 
+0

अरे मैं उपरोक्त परिणाम प्राप्त करने में सक्षम हूं लेकिन मेरी हालत यह है कि मुझे 0.5 वर्ष, 1 वर्ष, 1.5 वर्ष, 2 वर्ष, 2.5 वर्ष और इसी तरह की आवश्यकता है .. ऐसा कैसे किया जा सकता था!! – Dipen

2
TRY

साथ

PERIOD_DIFF (P1, P2)

अवधि P1 और P2 के बीच महीनों की संख्या देता है। पी 1 और पी 2 प्रारूप YYMM या YYYYMM प्रारूप में होना चाहिए। ध्यान दें कि अवधि तर्क P1 और P2 दिनांक मान नहीं हैं।

mysql> चयन PERIOD_DIFF (200802,200703); -> 11

+0

यह ओपी प्रश्न का उत्तर नहीं देता है क्योंकि यह डेटाटाइम प्रारूप या यहां तक ​​कि दिनांक प्रारूप स्वीकार नहीं करता है। हो सकता है कि अगर यह प्रश्न इसे दिखाया गया था तो मैं अपना -1 वापस ले सकता हूं। – amaster

0
TIMESTAMPDIFF(MONTH, Start_date, End_date) 

उदाहरण:

SELECT TIMESTAMPDIFF(MONTH, BirthDate, DateOfService) AS Months FROM Table 
-1

और एक गूगल खोज सभी प्रश्नों के उत्तर का एक सारांश के आधार पर, मुझे लगता है कि यह लिखने के लिए चार लगभग समान तरीके हैं:

1)

TIMESTAMPDIFF(MONTH, Start_date, End_date) AS Period 

ईजी

TIMESTAMPDIFF(MONTH, MIN(r.rental_date), MAX(r.rental_date)) AS Period 

2)

PERIOD_DIFF(date_format(now(), '%Y%m'), date_format(time, '%Y%m')) as months 

या

PERIOD_DIFF(date_format(End_date(), '%Y%m'), date_format(Start_date, '%Y%m')) as months 

जैसे

PERIOD_DIFF(date_format(MAX(r.rental_date), '%Y%m'), date_format(MIN(r.rental_date), '%Y%m')) as months 

3)

PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM NOW()), EXTRACT(YEAR_MONTH FROM time)) AS months 

या

PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM End_date()), EXTRACT(YEAR_MONTH FROM Start_date)) AS months 

जैसे

PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM MAX(r.rental_date)), EXTRACT(YEAR_MONTH FROM MIN(r.rental_date))) as Months 

4)

PERIOD_DIFF(concat(year(d1),if(month(d1)<10,'0',''),month(d1)), concat(year(d2),if(month(d2)<10,'0',''),month(d2))) as Months** 

जैसे

PERIOD_DIFF(
      concat(year(MAX(r.rental_date)),if(month(MAX(r.rental_date))<10,'0',''),month(MAX(r.rental_date))), 
      concat(year(MIN(r.rental_date)),if(month(MIN(r.rental_date))<10,'0',''),month(MIN(r.rental_date))) 
      ) as Months 
0

'दाएं' उत्तर बिल्कुल वही है जो आपको चाहिए। मुझे निकटतम पूर्ण संख्या पर जाना पसंद है।

इन उदाहरणों पर विचार करें: 1 जनवरी -> 31 जनवरी: यह पूरे महीने और लगभग 1 महीने लंबा है। 1 जनवरी -> 1 फरवरी? यह 1 महीना महीना है, और वास्तव में 1 महीने लंबा है।

पूरे महीनों की संख्या प्राप्त करने के लिए, का उपयोग करें:

SELECT TIMESTAMPDIFF(MONTH, '2018-01-01', '2018-01-31'); => 0 
SELECT TIMESTAMPDIFF(MONTH, '2018-01-01', '2018-02-01'); => 1 

एक महीनों में गोल अवधि पाने के लिए आपको इस्तेमाल कर सकते हैं:

SELECT ROUND(TIMESTAMPDIFF(DAY, '2018-01-01', '2018-01-31')*12/365.24); => 1 
SELECT ROUND(TIMESTAMPDIFF(DAY, '2018-01-01', '2018-01-31')*12/365.24); => 1 

यह करने के लिए सटीक है +/- 5 दिन और 1000 साल से अधिक के लिए श्रेणियों के लिए। जेन का जवाब स्पष्ट रूप से अधिक सटीक है, लेकिन यह मेरी पसंद के लिए भी वर्बोज़ है।