SQLite में 2 तिथियों के बीच अंतर


110

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

SELECT Date('now') - DateCreated FROM Payment

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

जवाबों:


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

10
ध्यान दें कि फ़ंक्शन नाम के बावजूद कोई क्या सोच सकता है, इसमें दिनों की तुलना में अधिक ग्रैन्युलैरिटी है। यह कई दिनों का है, लेकिन यह आंशिक हो सकता है।
११'१२

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

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

3
इस धारणा के साथ DateCreated स्थानीय समय में है, यदि आप julianday('now') - julianday(DateCreated, 'utc')दोनों UTC बनाने के लिए करते हैं , तो यह उसी तरह काम नहीं करता है julianday('now', 'localtime') - julianday(DateCreated)। पूर्व डीएसटी दिनों के लिए खाता नहीं है और मार्च-नवंबर में बनाई गई तारीखों में एक अतिरिक्त घंटे जोड़ देगा। उत्तरार्द्ध वास्तव में इसके लिए खाता है। stackoverflow.com/questions/41007455/…
vapcguy

60

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

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
वर्गीय संस्करण 3.12.0 के लिए कास्ट एक्सप्रेशन को कोष्ठक के अंदर AS TYPE है। उदाहरण के लिए "कास्ट का चयन करें (5.6 इंटेगर के रूप में);" sqlite.org/lang_expr.html#castexpr अन्यथा वास्तव में उपयोगी उदाहरण हैं।
लूट

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

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

@ न्यूमैन कृपया अपने संपादन का प्रस्ताव रखें। मैं इसे यहां sqlitebrowser में चेक करूंगा और अगर काम करता है, तो निश्चित रूप से आपके संपादन को मंजूरी देगा। आपके समय के लिए शुक्रिया।
सायका

2
यह उत्तर स्वीकृत उत्तर, IMHO से कहीं अधिक विशेषता भरा है।
मार्कस पार्सन्स

33

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

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

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


मुझे यकीन नहीं है, लेकिन अगर यह कमांड कोड में था, और मूल्य 6 जनवरी 2013 डेटाबेस से आया था, तो किसी को उपयोग किए जाने वाले डेटा टाइप पर विचार करने की आवश्यकता है।
NoChance

23

SQLite प्रलेखन एक महान संदर्भ है और DateAndTimeFunctions पृष्ठ बुकमार्क करने के लिए एक अच्छा है।

यह याद रखना भी मददगार है कि स्क्वैलाइट कमांड लाइन उपयोगिता के साथ प्रश्नों को खेलना बहुत आसान है:

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

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

9

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

यदि आपकी तिथियाँ UTC में संग्रहीत हैं:

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

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

यदि आपकी तारीखें स्थानीय समय में संग्रहीत की जाती हैं, तो उपरोक्त कोड का उपयोग करने से आपका जवाब गलत होगा , घंटों तक आपकी जीएमटी ऑफसेट है। यदि आप मेरे जैसे पूर्वी अमेरिका में हैं, जो GMT -5 है, तो आपके परिणाम में 5 घंटे जुड़ जाएंगे। और यदि आप DateCreatedUTC के अनुरूप बनाने की कोशिश करते हैं क्योंकि 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')

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

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


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

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

@, यह एक बहुत अच्छी व्याख्या है और मुझे यकीन नहीं है कि क्या उम्मीद है? शायद अपना जवाब पोस्ट करें?
NoChance

आपके व्याख्या के लिये धन्यवाद। मुझे यकीन नहीं है कि SQLite लोगों ने उन मानकों के खिलाफ जाने का फैसला किया है जो लोग वर्षों से स्वीकार करने के लिए बड़े हो गए हैं और एक अनावश्यक रूप से जटिल कार्यान्वयन और एक महत्वपूर्ण पहलू जैसे कि तारीख और समय में परीक्षण करने के लिए समाप्त हो गए हैं! आवेदन कार्यों में हर तारीख को सत्यापित करने के लिए आवश्यक परीक्षण मामलों की संख्या की कल्पना करें, जैसा कि मानव इसकी अपेक्षा करता है!
NoChance

3

टाइमक्लॉक कार्यों को लिखने के लिए बस एक नोट। काम के लिए घंटों की तलाश करने वालों के लिए, इसमें बहुत ही सरल परिवर्तन के घंटे मिलते हैं और मिनटों को 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

नीट छोटी क्वेरी, फिर भी, हालांकि :)
vapcguy

3

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

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

2

यह देखते हुए कि आपकी तिथि प्रारूप इस प्रकार है: "YYYY-MM-DD HH: MM: SS", यदि आपको दो तिथियों के बीच महीनों की संख्या में अंतर खोजने की आवश्यकता है:

(strftime('%m', date1) + 12*strftime('%Y', date1)) - (strftime('%m', date2) + 12*strftime('%Y', date2))


2

सबसे पहले, यह स्पष्ट नहीं है कि आपका दिनांक प्रारूप क्या है। पहले से ही एक उत्तर शामिल है 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


0

यदि आप दिनों के बीच रिकॉर्ड चाहते हैं,

select count(col_Name) from dataset where cast(julianday("now")- julianday(_Last_updated) as int)<=0;

0

मेरे मामले में, मुझे मिनटों में अंतर की गणना करनी है और julianday()एक सटीक मूल्य नहीं देना है। इसके बजाय, मैं उपयोग करता हूं strftime():

SELECT (strftime('%s', [UserEnd]) - strftime('%s', [UserStart])) / 60

दोनों तिथियों को एक समय (सेकंड) में बदल दिया जाता है, फिर दोनों तिथियों के बीच सेकंड में मूल्य प्राप्त करने के लिए घटाया जाता है। अगला, इसे 60 से विभाजित करें।

https://www.sqlite.org/cvstrac/wiki?p=DateAndTimeFunctions

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.