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

टी-एसक्यूएल में दो डेटाटाइम्स के बीच अंतर की गणना कैसे करें

समस्या:

आपके पास 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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. डेटा प्रकार की पसंद का कितना प्रभाव हो सकता है?

  2. इन-मेमोरी OLTP के लिए DML स्टेटमेंट का परीक्षण करना

  3. एक ऑनलाइन सर्वेक्षण के लिए एक डेटाबेस मॉडल। भाग 4

  4. SQL में विदेशी कुंजी कैसे जोड़ें?

  5. अनुकूलन चरण और छूटे हुए अवसर