SQLite

2008-11-14 3 views
75

में 2 तिथियों के बीच अंतर SQLite में 2 तिथियों के बीच के दिनों में अंतर कैसे प्राप्त करूं? मैंने पहले ही ऐसा कुछ करने की कोशिश की है:SQLite

SELECT Date('now') - DateCreated FROM Payment 

यह हर बार 0 देता है।

उत्तर

86
SELECT julianday('now') - julianday(DateCreated) FROM Payment; 
+8

ध्यान दें कि के बावजूद क्या समारोह नाम एक थिंक कर सकता है, इस दिन की तुलना में अधिक विवरण के स्तर को नहीं है। यह कई दिनों का है, लेकिन आंशिक हो सकता है। – lindes

+7

ध्यान रखें कि जुलिएंडे 'दिनों' की (आंशिक) संख्या लौटाता है - यानी 24 घंटे की अवधि, क्योंकि मूल तिथि पर * दोपहर * यूटीसी। आमतौर पर आपको वह चाहिए जो आपको चाहिए, जब तक कि आप ग्रीनविच के 12 घंटे पश्चिम में नहीं रहें। जैसे यदि आप लंदन में रहते हैं, तो आज सुबह दोपहर के रूप में एक ही जुलींदे पर है। – JulianSymes

+1

यह काम करता है यदि आपकी 'डेटक्रेटेड' यूटीसी में है। यदि, इसके बजाय, यह स्थानीय समय है, तो आपको स्थानीय समय पर 'जुलींदे (' अब ')' रूपांतरित करना होगा। मुझे यह जानकारी कहीं भी नहीं मिली थी। यदि आप 'जुलींदे (' अब ') करते हैं - जुलींदे (डेटक्रेटेड)' इस पोस्ट की तरह स्थानीय समय में संग्रहीत तारीख के साथ सुझाव मिलता है, तो आपका उत्तर जीएमटी से आपके ऑफसेट से बंद हो जाएगा और गलत होगा। हालांकि स्थानीय समय में तारीखों को स्टोर करने का सबसे अच्छा अभ्यास नहीं हो सकता है, फिर भी यह उन ऐप्स में हो सकता है जहां टाइमज़ोन कोई फर्क नहीं पड़ता है (सिवाय इसके कि जब आप जिस टूल के साथ काम कर रहे हैं, उसे यहां पर मजबूर कर दें)। – vapcguy

19

SQLite विकि एक महान संदर्भ है और DateAndTimeFunctions पृष्ठ को बुकमार्क करने के लिए एक अच्छा एक है। यह भी याद रखना है कि यह SQLite कमांड लाइन उपयोगिता के साथ प्रश्नों के साथ खेलने के लिए बहुत आसान है उपयोगी है:

sqlite> select julianday(datetime('now')); 
2454788.09219907 
sqlite> select datetime(julianday(datetime('now'))); 
2008-11-17 14:13:55 
+1

चूंकि यह पृष्ठ Google खोज इंजन रैंकिंग के साथ आता है, यहां वर्तमान लिंक: https: //www.sqlite। संगठन/lang_datefunc.html – markusN

+1

फिक्स्ड।स्क्लाइट संस्करण 3.12.0 के लिए धन्यवाद @markusN – cosimo

29

दोनों जवाब के रूप में वे होने की जरूरत है, थोड़ा और अधिक जटिल समाधान प्रदान करते हैं। मान लें कि भुगतान January 6, 2013 पर बनाया गया था। और हम इस तिथि और आज के बीच के अंतर को जानना चाहते हैं।

sqlite> SELECT julianday() - julianday('2013-01-06'); 
34.7978485878557 

अंतर 34 दिन है। बेहतर स्पष्टता के लिए हम julianday('now') का उपयोग कर सकते हैं। दूसरे शब्दों में, हमें date() या datetime()julianday() फ़ंक्शन के पैरामीटर के रूप में कार्य करने की आवश्यकता नहीं है।

23

अंतर दिनों में

Select Cast ((
    JulianDay(ToDate) - JulianDay(FromDate) 
) As Integer) 

घंटे में अंतर

Select Cast ((
    JulianDay(ToDate) - JulianDay(FromDate) 
) * 24 As Integer) 

अंतर मिनट में

Select Cast ((
    JulianDay(ToDate) - JulianDay(FromDate) 
) * 24 * 60 As Integer) 

अंतर सेकंड

Select Cast ((
    JulianDay(ToDate) - JulianDay(FromDate) 
) * 24 * 60 * 60 As Integer) 
+1

कास्ट अभिव्यक्ति में ब्रैकेट के अंदर AS TYPE है। जैसे "कास्ट का चयन करें (5.6 पूर्णांक के रूप में);" https://www.sqlite.org/lang_expr.html#castexpr अन्यथा वास्तव में उपयोगी उदाहरण। – rob

+0

धन्यवाद @rob। किसी ने मुझे पहले ऐसा करने का प्रस्ताव दिया था। लेकिन जब मैंने स्क्लिटेब्रोसर में कोशिश की, तो यह काम नहीं कर रहा था। शायद पुराने संस्करण होने के कारण। इसलिए मैंने इसे रखा है .. – Sayka

+0

मैंने अभी SQLitebrowser का उपयोग किया है और त्रुटि का उल्लेख किया गया है .. क्या मैं आपकी पोस्ट को आधुनिक शब्द में संपादित कर सकता हूं? – Noumenon

2

बस timeclock कार्यों लिखने के लिए एक नोट में। घंटों के लिए काम करने वाले लोगों के लिए, इसमें एक बहुत ही सरल परिवर्तन घंटों के साथ-साथ 60 के प्रतिशत के रूप में दिखाया जाता है क्योंकि अधिकांश पेरोल कंपनियां इसे चाहती हैं।

CAST ((julianday(clockOUT) - julianday(clockIN)) * 24 AS REAL) AS HoursWorked

Clock In   Clock Out   HoursWorked 
2016-08-07 11:56 2016-08-07 18:46 6.83333332836628 
+0

के लिए एक विकल्प के रूप में, थोड़ा कम क्वेरी, फिर भी, हालांकि :) – vapcguy

3

इस उत्तर एक छोटे से घना है, और प्रलेखन आप इस से नहीं कहेंगे (क्योंकि वे मानते हैं आप के रूप में यूटीसी डेटाबेस में तारीखें अपनी तिथियाँ भंडारण कर रहे हैं), लेकिन जवाब देने के लिए यह प्रश्न बड़े पैमाने पर उस समय पर निर्भर करता है जिस पर आपकी तिथियां संग्रहीत की जाती हैं। आप Date('now') का भी उपयोग नहीं करते हैं, लेकिन julianday() फ़ंक्शन का उपयोग करें, दोनों तारीखों को एक सामान्य तिथि के विरुद्ध वापस गणना करने के लिए, फिर एक दूसरे से उन परिणामों के अंतर को घटाएं।

अपनी तिथियाँ यूटीसी में जमा हो जाती हैं:

SELECT julianday('now') - julianday(DateCreated) FROM Payment; 

यह वही शीर्ष क्रम के जवाब है, और the documentation में भी है। यदि आप मुझसे पूछें तो यह तस्वीर का एक हिस्सा है, और एक बहुत ही सरल जवाब है।

यदि आपकी तिथियां स्थानीय समय में संग्रहीत हैं, तो उपर्युक्त कोड का उपयोग करके आपका उत्तर WRONG आपके जीएमटी ऑफसेट के घंटों की संख्या से होगा। यदि आप मेरे जैसे पूर्वी यू.एस. में हैं, जो जीएमटी -5 है, तो आपके परिणाम में 5 घंटे जोड़े जाएंगे। और तुम DateCreated बनाने का प्रयास करें, तो यूटीसी के अनुरूप है क्योंकि julianday('now') एक जीएमटी तारीख के खिलाफ जाता है:

SELECT julianday('now') - julianday(DateCreated, 'utc') FROM Payment; 

यह एक बग जहां यह एक DateCreated डेलाइट सेविंग टाइम (मार्च-नवंबर) के दौरान यह है कि के लिए एक घंटे जोड़ देगा है। कहें कि "अब" दोपहर में गैर-डीएसटी दिन पर है, और आपने दोपहर में जून (डीएसटी के दौरान) कुछ वापस बनाया है, तो आपका परिणाम घंटे के हिस्से के लिए 0 घंटे के बजाय 1 घंटे अलग करेगा। आपको अपने एप्लिकेशन के कोड में एक फ़ंक्शन लिखना होगा जो परिणाम को संशोधित करने और डीएसटी तिथियों से एक घंटे घटाए जाने के परिणाम को प्रदर्शित कर रहा है। मैंने वह किया, जब तक मुझे एहसास हुआ कि वहाँ है कि समस्या का एक बेहतर समाधान है कि मैं हो रही थी है: SQLite vs. Oracle - Calculating date differences - hours

इसके बजाय, के रूप में मेरे लिए बताया गया स्थानीय समय में संग्रहीत दिनांकों, स्थानीय समय में दोनों मैच:

SELECT julianday('now', 'localtime') - julianday(DateCreated) FROM Payment; 

या संलग्न 'Z' स्थानीय समय में:

julianday(datetime('now', 'localtime')||'Z') - julianday(CREATED_DATE||'Z') 

इन दोनों क्षतिपूर्ति करने के लिए लग रहे हैं और डीएसटी दिनांकों अतिरिक्त घंटे में शामिल न करें और सीधे घटाव करते हैं - ताकि आइटम एक डीएसटी दिन को दोपहर में बनाया है, गैर-डीएस पर दोपहर में जांच करते समय टी दिन, गणना करते समय एक अतिरिक्त घंटे नहीं मिलेगा।

और जब मैं सबसे अधिक पहचानता हूं तो कहता हूं कि अपने डेटाबेस में स्थानीय समय में तारीखों को स्टोर नहीं करते हैं, और उन्हें यूटीसी में स्टोर करने के लिए नहीं करते हैं, इसलिए आप इसमें भाग नहीं लेते हैं, अच्छी तरह से प्रत्येक एप्लिकेशन में विश्वव्यापी दर्शक नहीं होते हैं, और प्रत्येक प्रोग्रामर अपने सिस्टम में यूटीसी में हर तारीख के रूपांतरण के माध्यम से नहीं जाना चाहता है और डेटाबेस में जीईटी या एसईटी करते समय हर बार फिर से वापस जाना चाहता है और कुछ स्थानीय या यूटीसी में पता लगाने के साथ सौदा करता है।

+0

" यह तस्वीर का केवल एक हिस्सा है, और एक बहुत ही सरल जवाब है, अगर आप मुझसे पूछें। " हाँ आप सही हैं। लेकिन जब मेरा दो साल बाद आया तो उसने अपने प्रश्न पूछने के 3 मिनट बाद मेरा जवाब दिया था। सरल लेकिन वह उसे सूट लग रहा था। – Fred

+1

@Fred मेला पर्याप्त है। लेकिन यह वास्तव में मुझे एक सवारी के लिए ले गया, जैसा कि मैंने ऊपर वर्णित किया है, और इसलिए मेरी मदद नहीं की। मैं यह सुनिश्चित करना चाहता था कि भविष्य में इसे देखकर कोई भी जानता था कि क्या हो रहा था, इसलिए उन्होंने वही नुकसान नहीं मारा जो मैंने किया - या, अगर उन्होंने किया, तो वे जान लेंगे कि उनसे कैसे बाहर निकलना है। – vapcguy

1

आप 00:00 प्रारूप में समय चाहते हैं: मैं इसे इस तरह हल:

select strftime('%H:%M',CAST ((julianday(FinishTime) - julianday(StartTime)) AS REAL),'12:00') from something