समस्या:
आपके पास datetime . प्रकार के दो कॉलम हैं और आप उनके बीच के अंतर की गणना करना चाहते हैं।
उदाहरण:
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, DATEDIFF(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 |
चर्चा:
arrival . के बीच अंतर की गणना करने के लिए और T-SQL में प्रस्थान, DATEDIFF(datepart, startdate, enddate) का उपयोग करें समारोह। datepart तर्क microsecond . हो सकता है , second , minute , hour , day , week , month , quarter , या year . यहां, आप सेकंड में अंतर प्राप्त करना चाहते हैं, इसलिए दूसरा चुनें। घंटों में अंतर पाने के लिए, hour choose चुनें; महीनों में अंतर के लिए, month चुनें , आदि। startdate और enddate तर्क आरंभ और अंत हैं datetime कॉलम, क्रमशः (यहां, departure और arrival , क्रमशः)।
समाधान 2 (दिन, घंटे, मिनट और सेकंड में अंतर):
WITH difference_in_seconds AS (
SELECT
id,
departure,
arrival,
DATEDIFF(SECOND, departure, arrival) AS seconds
FROM travel
),
differences AS (
SELECT
id,
departure,
arrival,
seconds,
seconds % 60 AS seconds_part,
seconds % 3600 AS minutes_part,
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 सेकंड |
चर्चा:
सबसे पहले, arrival . के बीच अंतर की गणना करें और departure सेकंड में, DATEDIFF() . का उपयोग करके फ़ंक्शन (पहला CTE, जिसका नाम difference_in_seconds . है ), जैसा कि समाधान 1 में है। फिर, गणना करें कि कितने सेकंड पूरे मिनट से अधिक हैं (seconds_part ) सेकंड की गणना करने के लिए बाद में उपयोग किया जाना है, कितने सेकंड पूरे घंटे से अधिक हैं (minutes_part ) बाद में मिनटों की गणना करने के लिए उपयोग किया जाएगा, और कितने सेकंड पूरे घंटे से अधिक हैं (hours_part ) बाद में घंटों की गणना करने के लिए उपयोग किया जाएगा।
ऐसा करने के लिए, % ऑपरेटर का उपयोग करें। उदाहरण के लिए, एक घंटे में 3600 सेकंड होते हैं, इसलिए minutes_part में कितने सेकंड हैं यह पता लगाने के लिए , भाग से शेषफल को 3600 तक इस प्रकार खोजें:
seconds % 3600 AS minutes_part
इसी तरह, 3600 * 24 . हैं एक दिन में सेकंड, इसलिए गणना करने के लिए कि hours_part . में कितने सेकंड हैं , लिखें:
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
यहां प्रस्तुत समाधान एक datetime returns देता है पाठ के रूप में अंतर। आप बिना किसी टेक्स्ट के केवल संख्याएं प्राप्त करने के लिए समाधान को आसानी से संशोधित कर सकते हैं। आप दिन, घंटे, मिनट और सेकंड को अलग-अलग कॉलम में भी स्टोर कर सकते हैं:
FLOOR(seconds / 3600 / 24) AS days, FLOOR(hours_part / 3600) AS hours, FLOOR(minutes_part / 60) AS minutes, seconds_part AS seconds