मैं SQLite में 2 तिथियों के बीच के दिनों में अंतर कैसे प्राप्त करूं? मैंने पहले ही कुछ इस तरह की कोशिश की है:
SELECT Date('now') - DateCreated FROM Payment
यह हर बार 0 देता है।
मैं SQLite में 2 तिथियों के बीच के दिनों में अंतर कैसे प्राप्त करूं? मैंने पहले ही कुछ इस तरह की कोशिश की है:
SELECT Date('now') - DateCreated FROM Payment
यह हर बार 0 देता है।
जवाबों:
SELECT julianday('now') - julianday(DateCreated) FROM Payment;
DateCreated
यूटीसी में है। यदि, इसके बजाय, यह स्थानीय समय है, तो आपको julianday('now')
स्थानीय समय में बदलना होगा। मुझे यह जानकारी नहीं थी। यदि आपको यह julianday('now') - julianday(DateCreated)
पसंद है कि यह पोस्ट स्थानीय समय में संग्रहीत तिथि के साथ सुझाती है, तो आपका जवाब GMT से आपके ऑफसेट द्वारा बंद हो जाएगा और गलत होगा। हालांकि शायद स्थानीय समय में तारीखों को संग्रहीत करने के लिए सबसे अच्छा अभ्यास नहीं है, यह अभी भी उन ऐप्स में हो सकता है जहां टाइमज़ोन कोई फर्क नहीं पड़ता है (सिवाय इसके कि जब आप जिस टूल के साथ काम कर रहे हैं वह आपको यहां पर पसंद करता है)।
julianday('now') - julianday(DateCreated, 'utc')
दोनों UTC बनाने के लिए करते हैं , तो यह उसी तरह काम नहीं करता है julianday('now', 'localtime') - julianday(DateCreated)
। पूर्व डीएसटी दिनों के लिए खाता नहीं है और मार्च-नवंबर में बनाई गई तारीखों में एक अतिरिक्त घंटे जोड़ देगा। उत्तरार्द्ध वास्तव में इसके लिए खाता है। stackoverflow.com/questions/41007455/…
अंतर दिनों में
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)
दोनों उत्तर समाधान को और अधिक जटिल प्रदान करते हैं, क्योंकि उन्हें होना चाहिए। कहते हैं भुगतान किया गया था January 6, 2013
। और हम इस तारीख और आज के बीच का अंतर जानना चाहते हैं।
sqlite> SELECT julianday() - julianday('2013-01-06');
34.7978485878557
अंतर 34 दिनों का है। हम julianday('now')
बेहतर स्पष्टता के लिए उपयोग कर सकते हैं । दूसरे शब्दों में, हमें कार्य करने के लिए पैरामीटर के रूप में कार्य करने date()
या करने की आवश्यकता नहीं है
।datetime()
julianday()
SQLite प्रलेखन एक महान संदर्भ है और DateAndTimeFunctions पृष्ठ बुकमार्क करने के लिए एक अच्छा है।
यह याद रखना भी मददगार है कि स्क्वैलाइट कमांड लाइन उपयोगिता के साथ प्रश्नों को खेलना बहुत आसान है:
sqlite> select julianday(datetime('now'));
2454788.09219907
sqlite> select datetime(julianday(datetime('now')));
2008-11-17 14:13:55
यह उत्तर थोड़ा लंबा-घुमावदार है, और दस्तावेज़ीकरण आपको यह नहीं बताएगा (क्योंकि वे मानते हैं कि आप डेटाबेस में यूटीसी तिथियों के रूप में अपनी तिथियां संग्रहीत कर रहे हैं), लेकिन इस प्रश्न का उत्तर काफी हद तक उस समय निर्भर करता है जो आपकी तिथियां संग्रहीत हैं में, आप भी उपयोग नहीं करते हैं Date('now')
, लेकिन julianday()
फ़ंक्शन का उपयोग करते हैं, दोनों तिथियों की गणना एक सामान्य तिथि के खिलाफ करते हैं, फिर उन परिणामों के अंतर को एक दूसरे के साथ घटाते हैं।
यदि आपकी तिथियाँ UTC में संग्रहीत हैं:
SELECT julianday('now') - julianday(DateCreated) FROM Payment;
यह वही है जो शीर्ष क्रम का उत्तर है, और दस्तावेज में भी है । यह केवल तस्वीर का हिस्सा है, और एक बहुत ही सरल उत्तर है, अगर आप मुझसे पूछें।
यदि आपकी तारीखें स्थानीय समय में संग्रहीत की जाती हैं, तो उपरोक्त कोड का उपयोग करने से आपका जवाब गलत होगा , घंटों तक आपकी जीएमटी ऑफसेट है। यदि आप मेरे जैसे पूर्वी अमेरिका में हैं, जो GMT -5 है, तो आपके परिणाम में 5 घंटे जुड़ जाएंगे। और यदि आप DateCreated
UTC के अनुरूप बनाने की कोशिश करते हैं क्योंकि julianday('now')
GMT की तारीख के विपरीत है:
SELECT julianday('now') - julianday(DateCreated, 'utc') FROM Payment;
इसमें एक बग है जहां यह DateCreated
डेलाइट सेविंग टाइम (मार्च-नवंबर) के दौरान एक घंटे के लिए जोड़ देगा । यह कहें कि "अब" एक गैर-डीएसटी दिन पर दोपहर में है, और आपने जून में (डीएसटी के दौरान) दोपहर में कुछ वापस बनाया, आपका परिणाम घंटे के भाग के लिए, 0 घंटे के बजाय 1 घंटे देगा। आपको अपने आवेदन के कोड में एक फ़ंक्शन लिखना होगा जो परिणाम को संशोधित करने के लिए परिणाम प्रदर्शित कर रहा है और डीएसटी की तारीखों से एक घंटे घटाता है। मैंने ऐसा किया, जब तक मुझे एहसास हुआ कि उस समस्या का एक बेहतर समाधान है जो मुझे हो रहा था: SQLite बनाम Oracle - तिथि अंतर की गणना - घंटे
इसके बजाय, जैसा कि मुझे बताया गया था, स्थानीय समय में संग्रहीत तिथियों के लिए, दोनों मैच स्थानीय समय के लिए करें:
SELECT julianday('now', 'localtime') - julianday(DateCreated) FROM Payment;
या 'Z'
स्थानीय समय के लिए अपील :
julianday(datetime('now', 'localtime')||'Z') - julianday(CREATED_DATE||'Z')
ये दोनों क्षतिपूर्ति करते हैं और डीएसटी की तारीखों के लिए अतिरिक्त घंटे नहीं जोड़ते हैं और सीधे घटाव करते हैं - ताकि एक डीएसटी के दिन दोपहर में बनाई गई वस्तु, जब एक गैर-डीएसटी दिन में दोपहर में जांच हो, तो एक अतिरिक्त घंटे नहीं मिलेगा जब गणना करना।
और जब मैं पहचानता हूं कि ज्यादातर कहेंगे कि अपने डेटाबेस में स्थानीय समय में तारीखों को संग्रहीत न करें, और उन्हें यूटीसी में संग्रहीत करने के लिए ताकि आप इसमें भाग न लें, अच्छी तरह से हर एप्लिकेशन में एक विश्वव्यापी दर्शक नहीं है, और हर प्रोग्रामर नहीं चाहता है यूटीसी में उनकी प्रणाली में हर तारीख के रूपांतरण के माध्यम से जाने के लिए और हर बार जब वे डेटाबेस में एक गेट या सेट प्राप्त करते हैं और यह पता लगाने के साथ सौदा करते हैं कि क्या कुछ स्थानीय या यूटीसी में है।
टाइमक्लॉक कार्यों को लिखने के लिए बस एक नोट। काम के लिए घंटों की तलाश करने वालों के लिए, इसमें बहुत ही सरल परिवर्तन के घंटे मिलते हैं और मिनटों को 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
यदि आप 00:00 प्रारूप में समय चाहते हैं: मैंने इसे इस तरह हल किया:
select strftime('%H:%M',CAST ((julianday(FinishTime) - julianday(StartTime)) AS REAL),'12:00') from something
सबसे पहले, यह स्पष्ट नहीं है कि आपका दिनांक प्रारूप क्या है। पहले से ही एक उत्तर शामिल है strftime("%s")
।
मुझे उस उत्तर पर विस्तार करना पसंद है।
SQLite में केवल निम्न संग्रहण वर्ग हैं: NULL, INTEGER, REAL, TEXT या BLOB। चीजों को सरल बनाने के लिए, मैं मान रहा हूं कि तारीखें 1970-01-01 से वास्तविक हैं। यहाँ एक नमूना स्कीमा है जिसके लिए मैं "1 दिसंबर 2018" का नमूना डेटा डालूंगा:
CREATE TABLE Payment (DateCreated REAL);
INSERT INTO Payment VALUES (strftime("%s", "2018-12-01"));
अब "1 दिसंबर 2018" के बीच की तारीख के अंतर पर काम करते हैं और अब (जैसा कि मैं यह लिखता हूं, यह 12 दिसंबर 2018 की दोपहर है):
दिनों में अंतर:
SELECT (strftime("%s", "now") - DateCreated) / 86400.0 FROM Payment;
-- Output: 11.066875
घंटे में अंतर दिनांक:
SELECT (strftime("%s", "now") - DateCreated) / 3600.0 FROM Payment;
-- Output: 265.606388888889
मिनटों में अंतर:
SELECT (strftime("%s", "now") - DateCreated) / 60.0 FROM Payment;
-- Output: 15936.4833333333
सेकंड में दिनांक का अंतर:
SELECT (strftime("%s", "now") - DateCreated) FROM Payment;
-- Output: 956195.0
यदि आप सेकंड में अंतर चाहते हैं
SELECT strftime('%s', '2019-12-02 12:32:53') - strftime('%s', '2019-12-02 11:32:53')
यदि आप दिनों के बीच रिकॉर्ड चाहते हैं,
select count(col_Name) from dataset where cast(julianday("now")- julianday(_Last_updated) as int)<=0;
मेरे मामले में, मुझे मिनटों में अंतर की गणना करनी है और julianday()
एक सटीक मूल्य नहीं देना है। इसके बजाय, मैं उपयोग करता हूं strftime()
:
SELECT (strftime('%s', [UserEnd]) - strftime('%s', [UserStart])) / 60
दोनों तिथियों को एक समय (सेकंड) में बदल दिया जाता है, फिर दोनों तिथियों के बीच सेकंड में मूल्य प्राप्त करने के लिए घटाया जाता है। अगला, इसे 60 से विभाजित करें।