समस्या:
आपके पास टाइमस्टैम्प प्रकार के दो कॉलम हैं और आप उनके बीच के अंतर की गणना करना चाहते हैं।
उदाहरण:
travel
तालिका, तीन कॉलम हैं:id
, departure
, और arrival
. आप arrival
. के बीच अंतर की गणना करना चाहेंगे और departure
।
travel
तालिका इस तरह दिखती है:
आईडी | प्रस्थान | आगमन |
---|---|---|
1 | 2018-03-25 12:00:00 | 2018-04-05 07:30:00 |
2 | 2019-09-12 15:50:00 | 2019-10-23 10:30:30 |
3 | 2018-07-14 16:15:00 | 2018-07-14 20:40:30 |
4 | 2018-01-05 08:35:00 | 2019-01-08 14:00:00 |
समाधान 1 (दिन, घंटे, मिनट या सेकंड में अंतर):
SELECT id, departure, arrival, TIMESTAMPDIFF(SECOND, departure, arrival) AS difference FROM travel;
नतीजा यह है:
आईडी | प्रस्थान | आगमन | अंतर |
---|---|---|---|
1 | 2018-03-25 12:00:00 | 2018-04-05 07:30:00 | 934200 |
2 | 2019-09-12 15:50:00 | 2019-10-23 10:30:30 | 3523230 |
3 | 2018-07-14 16:15:00 | 2018-07-14 20:40:30 | 15930 |
4 | 2018-01-05 08:35:00 | 2019-01-08 14:00:00 | 31814700 |
चर्चा:
MySQL में टाइमस्टैम्प के बीच अंतर की गणना करने के लिए, TIMESTAMPDIFF(unit, start, end)
का उपयोग करें। समारोह। इकाई तर्क MICROSECOND
. हो सकता है , SECOND
, MINUTE
, HOUR
, DAY
, WEEK
, MONTH
, QUARTER
, या YEAR
. सेकंड में अंतर प्राप्त करने के लिए जैसा हमने यहां किया है, SECOND
. चुनें . मिनटों में अंतर पाने के लिए, MINUTE
choose चुनें; घंटों के अंतर के लिए, HOUR
choose चुनें , आदि। अंत और प्रारंभ तर्क क्रमशः समाप्ति टाइमस्टैम्प और प्रारंभिक टाइमस्टैम्प हैं (यहां, departure
और arrival
, respectively
)।
समाधान 2 (दिन, घंटे, मिनट और सेकंड में अंतर):
WITH difference_in_seconds AS ( SELECT id, departure, arrival, TIMESTAMPDIFF(SECOND, departure, arrival) AS seconds FROM travel ), differences AS ( SELECT id, departure, arrival, seconds, MOD(seconds, 60) AS seconds_part, MOD(seconds, 3600) AS minutes_part, MOD(seconds, 3600 * 24) AS hours_part FROM difference_in_seconds ) SELECT id, departure, arrival, CONCAT( FLOOR(seconds / 3600 / 24), ' days ', FLOOR(hours_part / 3600), ' hours ', FLOOR(minutes_part / 60), ' minutes ', seconds_part, ' seconds' ) AS difference FROM differences;
नतीजा यह है:
आईडी | प्रस्थान | आगमन | अंतर |
---|---|---|---|
1 | 2018-03-25 12:00:00 | 2018-04-05 07:30:00 | 10 दिन 19 घंटे 30 मिनट 0 सेकंड |
2 | 2019-09-12 15:50:00 | 2019-10-23 10:30:30 | 40 दिन 18 घंटे 40 मिनट 30 सेकंड |
3 | 2018-07-14 16:15:00 | 2018-07-14 20:40:30 | 0 दिन 4 घंटे 25 मिनट 30 सेकंड |
4 | 2018-01-05 08:35:00 | 2019-01-08 14:00:00 | 368 दिन 5 घंटे 25 मिनट 0 सेकंड |
चर्चा:
सबसे पहले, TIMESTAMPDIFF()
का उपयोग करके सेकंड में टाइमस्टैम्प के बीच अंतर की गणना करें फ़ंक्शन (पहला CTE, जिसका नाम difference_in_seconds
. है ), जैसा कि समाधान 1 में है। गणना करें कि कितने सेकंड पूरे मिनट से अधिक हैं (seconds_part
) सेकंड की गणना करने के लिए बाद में उपयोग किया जाना है, कितने सेकंड पूरे घंटे से अधिक हैं (minutes_part
) बाद में मिनटों की गणना करने के लिए उपयोग किया जाएगा, और कितने सेकंड पूरे घंटे से अधिक हैं (hours_part
) बाद में घंटों की गणना करने के लिए उपयोग किया जाएगा।
ऐसा करने के लिए, MOD()
. का उपयोग करें समारोह। उदाहरण के लिए, एक घंटे में 3600 सेकंड होते हैं, इसलिए minutes_part
में कितने सेकंड हैं यह पता लगाने के लिए , भाग से शेषफल को 3600 तक इस प्रकार खोजें:
MOD(seconds, 3600) AS minutes_part
इसी तरह, 3600 * 24
. हैं एक दिन में सेकंड, इसलिए गणना करने के लिए कि hours_part
. में कितने सेकंड हैं , लिखें:
MOD(seconds, 3600 * 24) AS hours_part
एक बार इन शेषफलों की गणना कर ली जाती है (दूसरे सीटीई में, जिसका नाम differences
. है ), आप अंत में दिनों, घंटों, मिनटों और सेकंडों में अंतर प्राप्त कर सकते हैं। सेकंड, मिनट, घंटे और दिनों की संख्या प्राप्त करने के लिए, शेष में सेकंड की संख्या को दिनों, घंटों या मिनटों में सेकंड की इसी संख्या से विभाजित करें। उदाहरण के लिए, यह पता लगाने के लिए कि कितने मिनट प्रदर्शित होने चाहिए, minutes_part
take लें और इसे 60 से भाग दें, क्योंकि एक घंटे में 60 मिनट होते हैं। आपको इसमें से केवल पूर्णांक भाग की आवश्यकता है (अर्थात, दशमलव भाग के बिना), इसलिए इस तरह FLOOR() फ़ंक्शन का उपयोग करें:
FLOOR(minutes_part / 60)
अंत में, आपको बस एक स्ट्रिंग में प्रदर्शित करने की आवश्यकता है जो आपने गणना की है। ऐसा करने के लिए, CONCAT()
. का उपयोग करें बाहरी क्वेरी में कार्य करें:
CONCAT( FLOOR(seconds / 3600 / 24), ' days ', FLOOR(hours_part / 3600), ' hours ', FLOOR(minutes_part / 60), ' minutes ', seconds_part, ' seconds' ) AS difference
यहां प्रस्तुत समाधान अंतिम कॉलम को टेक्स्ट के रूप में लौटाता है। आप इस समाधान को किसी अन्य प्रारूप में प्रदर्शित करने के लिए आसानी से संशोधित कर सकते हैं। आप संख्याओं को अलग-अलग कॉलमों में भी इस तरह प्रदर्शित कर सकते हैं:
FLOOR(seconds / 3600 / 24) AS days, FLOOR(hours_part / 3600) AS hours, FLOOR(minutes_part / 60) AS minutes, seconds_part AS seconds