SQLite DateTime तुलना


117

मैं एक sqlite डेटाबेस के खिलाफ क्वेरी से विश्वसनीय परिणाम प्राप्त करने के लिए एक तुलना के रूप में उपयोग करने के लिए ऐसा प्रतीत नहीं कर सकते हैं:

select * 
  from table_1 
 where mydate >= '1/1/2009' and mydate <= '5/5/2009'

मैं कैसे sqlite के लिए डेटाटाइम तुलना को संभालना चाहिए?

अद्यतन: फ़ील्ड mydate एक DateTime डेटाटाइप है


1
आपके mydateकॉलम में कौन सा प्रारूप प्रारूप संग्रहीत है ? मुझे लगता है कि यह SQLite समर्थित स्वरूपों में से एक नहीं है: sqlite.org/lang_datefunc.html
OMG Ponies

1
OMG, यह एक डेटाइम डेटाटाइप है
ब्रैड

4
डेटाटाइम () के उपयोग से आपके द्वारा दिए गए सटीक मान का परिणाम होगा, यहां इसका उपयोग करने का कोई कारण नहीं है: बस इसके बजाय स्ट्रिंग का उपयोग करें। और अगर आप केवल तारीखों के साथ काम कर रहे हैं, तो आपको शून्य समय भागों को हटाना चाहिए --- अनिवार्य रूप से सुनिश्चित करें कि दोनों पक्ष एक ही प्रारूप में हैं। (अन्यथा '2009-11-13', mydate के लिए, से कम होगा '2009-11-13 00:00:00'।)

1
SQLite वाले विज़ुअल स्टूडियो के लिए मेरे लिए एक तिथि / समय क्वेरी चलाने के लिए काम करने के लिए, मुझे Datetime()उसी तरह का उपयोग करने की आवश्यकता है जैसे @Brad ने समाधान के अपने उल्लेख में शामिल किया है। अन्यथा VS2012 शिकायत करता है। धन्यवाद ब्रैड।
कप्तानबली

समाधान के साथ अद्यतन करने के लिए धन्यवाद। कितना अजीब है कि .NET में दिनांक के लिए डिफ़ॉल्ट प्रारूप वास्तव में "<" बनाम ">" के विपरीत होगा।
डेव फ्रेडेल

जवाबों:


57

SQLite में समर्पित डाइमटाइम प्रकार नहीं होते हैं , लेकिन कुछ डेटाइम कार्य होते हैं । उन कार्यों द्वारा समझे गए स्ट्रिंग प्रतिनिधित्व प्रारूपों (वास्तव में केवल प्रारूप 1-10) का पालन करें (मूल्य को स्ट्रिंग के रूप में संग्रहीत करते हुए) और फिर आप उनका उपयोग कर सकते हैं, साथ ही तार पर लेक्सोग्राफ़िक तुलना डेटाइम तुलना (जब तक आप नहीं करते हैं, से मेल खाएगी) तारीखों या डेटेटाइमों की तुलना कई बार करने की कोशिश करें, जो पूरी तरह से बहुत मायने नहीं रखता है)।

आप किस भाषा का उपयोग करते हैं, इसके आधार पर, आप स्वचालित रूपांतरण भी प्राप्त कर सकते हैं । (जो उदाहरण की तरह SQL बयानों में तुलना पर लागू नहीं होता है, लेकिन आपके जीवन को आसान बना देगा।)


10
पहला वाक्य पढ़ने वालों के लिए, '17 SQLite में है dateऔरdatetime
alisianoi

3
कल यहाँ प्रकार आत्मीयता के बारे में पढ़ रहा था: sqlite.org/datatype3.html मूल रूप से, यदि आपको किसी तिथि की आवश्यकता है, तो आप उस स्तंभ पर date(या datetime) की घोषणा करते हैं जिसे आंतरिक रूप से माना जाता है text। जो मेरी जरूरतों को पूरा करता है।
एलिसियानो

100

इस समस्या को हल करने के लिए, मैं तारीखों को स्टोर करता हूं YYYYMMDD । इस प्रकार, where mydate >= '20090101' and mydate <= '20050505'

यह हर समय केवल सादा काम करता है। उपयोगकर्ताओं को अपनी तिथियों को दर्ज करने के लिए आपको केवल एक पार्सर लिखने की आवश्यकता हो सकती है ताकि आप उन्हें परिवर्तित कर सकें YYYYMMDD


2
बशर्ते प्रारूप मानकीकृत हो, YYYY-MM-DD बिना डैश के कैसे अलग होगा? तुलना एक ही अंत नहीं होगा?
डेमोन

2
@ डामन: मुझे लगता है कि वह
डेटेटाइप के

1
नहीं, ये तार हैं - आप इसे उद्धरण पर देख सकते हैं - लेकिन यह बहुत अच्छा विचार है: इस आदेश के साथ YY MM DD तिथियों की तुलना करना संभव है। @ डैमन को भी डैश के साथ काम करना चाहिए!
सेडाट किंसी

1
मुझे आश्चर्य है कि अगर मैं एक ही काम कर सकता हूं अगर मैं स्टोर करने के लिए प्रारूप yyyMMddHHmms का उपयोग करता हूं, ताकि मैं समय भाग को भी शामिल कर सकूं। यह एक अतिप्रवाह या कुछ कारण होगा?
faizal

2
मैं उपयोग करता हूं: yyyyMMddHHmm बिना किसी समस्या के, मुझे उम्मीद है कि आप yyyyMMddHHmms को काम करने के लिए समान होंगे
स्टीव बायरन

39

मेरा हाल ही में यही मुद्दा था, और मैंने इसे इस तरह हल किया:

SELECT * FROM table WHERE 
    strftime('%s', date) BETWEEN strftime('%s', start_date) AND strftime('%s', end_date)

% s को एकल उद्धरण वर्णों के बीच संलग्न किया जाना चाहिए, अर्थात: strftime ('% s', दिनांक)
mvladic

यह काम करता हैं। निश्चित तिथि के बाद सभी पंक्तियों का चयन करने के लिए संशोधित समाधान: चयन करें * तालिका से जहां strftime ('% s', जोड़ा)> strftime ('% s', "2017-01-01 00:00:00")
न्यू

मैं strftimeइस उदाहरण की तरह WHERE क्लॉज में उपयोग करके मूल्यांकन कर रहा हूं, और मेरा एक प्रश्न है: क्या strftimeइस तरह से उपयोग करना कुशल है ? क्या इसका मूल्यांकन प्रत्येक पंक्ति के लिए एक बार या प्रति प्रश्न एक बार किया जाता है?
अल्वारो गुटिरेज पेरेस

इसे सही उत्तर के रूप में स्वीकार किया जाना चाहिए!
लुका श

20

निम्नलिखित SQLite का उपयोग कर मेरे लिए ठीक काम कर रहा है:

SELECT * 
    FROM ingresosgastos 
    WHERE fecharegistro BETWEEN "2010-01-01" AND "2013-01-01"

इसने मेरे लिए iOS में काम किया, ऑब्जेक्टिव-सी माय क्वेरी इस प्रकार है: Select COUNT (carSold) FROM Cars_sales_tbl WHERE date BETWEEN '2015-04-01' और '2015-04-30' और carTr = "Hybrid"
Randika Vishman

9

Sqlite तारीखों पर तुलना नहीं कर सकते। हमें सेकंड में बदलने और पूर्णांक के रूप में डालने की आवश्यकता है।

उदाहरण

SELECT * FROM Table  
WHERE  
CAST(strftime('%s', date_field)  AS  integer) <=CAST(strftime('%s', '2015-01-01')  AS  integer) ;


6

मेरे पास एक ऐसी स्थिति है जहां मैं दो दिन पहले तक और आज के अंत तक डेटा चाहता हूं। मैं निम्नलिखित पर आ गया।

WHERE dateTimeRecorded between date('now', 'start of day','-2 days') 
                           and date('now', 'start of day', '+1 day') 

ठीक है, तकनीकी रूप से मैं भी मूल पोस्टर की तरह कल आधी रात को खींचता हूं, अगर कोई डेटा था, लेकिन मेरा डेटा सभी ऐतिहासिक है।

याद रखने वाली महत्वपूर्ण बात, प्रारंभिक पोस्टर ने 2009-11-15 00:00:00 के बाद सभी डेटा को बाहर कर दिया। इसलिए, 15 तारीख को आधी रात को दर्ज किए गए किसी भी डेटा को शामिल किया गया था लेकिन 15 तारीख की आधी रात के बाद का कोई भी डेटा नहीं था। यदि उनकी क्वेरी थी,

select * 
  from table_1 
  where mydate between Datetime('2009-11-13 00:00:00') 
                   and Datetime('2009-11-15 23:59:59')

स्पष्टता के लिए बीच के खंड का उपयोग।

यह थोड़ा बेहतर होता। यह अभी भी छलांग सेकंड में नहीं लेता है जिसमें एक घंटे में वास्तव में 60 सेकंड से अधिक हो सकता है, लेकिन यहां चर्चा के लिए पर्याप्त है :)


2

मुझे इसमें समय-क्षेत्र की जानकारी के साथ समय को संग्रहीत करना था, और निम्नलिखित प्रारूप के साथ काम करने में सक्षम प्रश्नों को प्राप्त करने में सक्षम था:

"SELECT * FROM events WHERE datetime(date_added) BETWEEN 
      datetime('2015-03-06 20:11:00 -04:00') AND datetime('2015-03-06 20:13:00 -04:00')"

डेटाबेस को समय को निम्नलिखित प्रारूप में नियमित पाठ के रूप में संग्रहीत किया जाता है:

2015-03-06 20:12:15 -04:00

2

नीचे तारीखों की तुलना करने के तरीके दिए गए हैं, लेकिन इससे पहले हमें डीबी में संग्रहीत तारीख के प्रारूप की पहचान करने की आवश्यकता है

मेरे पास MM / DD / YYYY HH: MM प्रारूप में संग्रहीत तिथियाँ हैं, इसलिए इसकी तुलना उस प्रारूप में की जानी चाहिए

  1. नीचे क्वेरी एमएम / डीडी / वाईवाईवाई प्रारूप में तारीख की तुलना करें और पिछले पांच दिनों से आज तक डेटा प्राप्त करें। BETWEEN ऑपरेटर मदद करेगा और आप बस प्रारंभ तिथि और समाप्ति तिथि निर्दिष्ट कर सकते हैं।

    select * from myTable where myColumn BETWEEN strftime('%m/%d/%Y %H:%M', datetime('now','localtime'), '-5 day') AND strftime('%m/%d/%Y %H:%M',datetime('now','localtime')); 
  2. नीचे क्वेरी ऑपरेटर (>) से अधिक का उपयोग करेगी।

      select * from myTable where myColumn > strftime('%m/%d/%Y %H:%M', datetime('now','localtime'), '-5 day');  

मेरे द्वारा की गई सभी गणना वर्तमान समय का उपयोग कर रही है, आप अपनी आवश्यकता के अनुसार प्रारूप और तिथि को बदल सकते हैं।

आशा है कि यह आपकी मदद करेगा

Summved


1

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


0

मेरी क्वेरी मैंने इस प्रकार की:

SELECT COUNT(carSold) 
FROM cars_sales_tbl
WHERE date
BETWEEN '2015-04-01' AND '2015-04-30'
AND carType = "Hybrid"

मुझे @ ifredy के जवाब से संकेत मिल गया। मैंने जो कुछ भी किया है, मैं चाहता था कि इस क्वेरी को उद्देश्य-सी का उपयोग करके, आईओएस में चलाया जाए। और यह काम करता है!

आशा है कि कोई व्यक्ति जो आईओएस डेवलपमेंट करता है, उसे इस उत्तर से भी फायदा मिलेगा!


0

अभी मैं System.Data.SQlite NuGet पैकेज (संस्करण 1.0.109.2) का उपयोग कर विकसित कर रहा हूं। जो SQLite संस्करण 3.24.0 का उपयोग कर रहा है।

और यह मेरे लिए काम करता है।

SELECT * FROM tables WHERE datetime 
BETWEEN '2018-10-01 00:00:00' AND '2018-10-10 23:59:59';

मैं डेटाइम () फ़ंक्शन का उपयोग करने के लिए नेट नहीं करता हूं। शायद उन्होंने पहले ही उस SQLite संस्करण पर SQL क्वेरी को अपडेट कर दिया था।

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