Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

MySQL में दो टाइमस्टैम्प के बीच अंतर की गणना कैसे करें

समस्या:

आपके पास टाइमस्टैम्प प्रकार के दो कॉलम हैं और आप उनके बीच के अंतर की गणना करना चाहते हैं।

उदाहरण:

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL AUTO_INCREMENT रोलबैक नहीं करता है

  2. mysql तालिका पंक्तियों को कॉलम में कैसे स्थानांतरित करें

  3. विंडोज़ xampp पर lower_case_table_names=2 का मान कहाँ बदलें?

  4. प्रति मान COUNT द्वारा आदेश

  5. हेक्साडेसिमल को वर्कर (डेटाटाइम) में कैसे डाला जाए?