2010-12-13 5 views
27

मेरे पास दिनांक "28/11/2010" जैसे स्क्लाइट डेटाबेस में स्ट्रिंग के रूप में संग्रहीत किया गया है। मैं स्ट्रिंग को आज तक कनवर्ट करना चाहता हूं।एसक्लाइट स्ट्रिंग को आज तक

विशेष रूप से मुझे दो तिथियों के बीच कई स्ट्रिंग तिथियों को परिवर्तित करना होगा।

पोस्टग्रेस्क्ल में, मैं to_date('30/11/2010','dd/MM/yyyy') का उपयोग करता हूं, मैं स्क्लाइट के साथ एक ही चीज़ कैसे कर सकता हूं?

कुछ इस तरह:

SELECT * FROM table 
    WHERE to_date(column,'dd/MM/yyyy') 
    BETWEEN to_date('01/11/2010','dd/MM/yyyy') 
    AND  to_date('30/11/2010','dd/MM/yyyy') 

उत्तर

46

SQLite doesn't have a date type के रूप में आप इस लक्ष्य को हासिल करने के लिए स्ट्रिंग तुलना करने की आवश्यकता होगी। आप उल्टा करने के लिए की जरूरत है काम करने के लिए के लिए - जैसे

where substr(column,7)||substr(column,4,2)||substr(column,1,2) 
     between '20101101' and '20101130' 
+1

+1: यदि तारीख को SQLite की डेट हैंडलिंग फ़ंक्शंस को समझने वाली किसी चीज़ में स्वरूपित किया गया था, तो कुछ बेहतर करना संभव होता। (या यदि तिथि डीबी में संग्रहीत करने से पहले जूलियन दिनों में परिवर्तित कर दी गई थी।) लेकिन यह नहीं था, और "तारीख" को संशोधित करने की आवश्यकता है। बेशक, वह अपना 'to_date' फ़ंक्शन जोड़ने का भी प्रयास कर सकता है, लेकिन यह कैसे करना है इस पर निर्भर करता है कि SQLite किस एम्बेडेड (जिसे हम नहीं जानते) पर निर्भर करता है। –

+1

@ डोनल फिर से अपना 'to_date' फ़ंक्शन बना रहा है, सट्टेबाजी क्या है कि उस फ़ील्ड में सभी स्ट्रिंग मान्य तिथियां नहीं हैं :-) –

8

एक बात आप ध्यान देना चाहिए dd/एम एम/yyyy YYYYMMDD करने से जैसे, कुछ का उपयोग कर आप के लिए करने जा रहे हैं, खासकर अगर SQLite date and time functions है, कई तिथियों में हेरफेर करें। आंतरिक प्रारूप को बदलने की लागत पर तारीखों का उपयोग करने का यह तरीका है (आईएसओ होना चाहिए, यानी yyyy-MM-dd)।

+3

यह दस्तावेज़ अधिक से अधिक उद्धृत है ... हालांकि, आईएमओ को इसे फिर से काम करने की आवश्यकता है जानकारी जल्दी से पाएं। सभी सार्थक विवरण दफन कर दिए गए हैं। उदाहरण के लिए, क्या 10 सेकंड से कम समय में पहली नजर में स्ट्रैटाइम फ़ंक्शन का रिटर्न प्रकार निर्धारित करना संभव है? नहीं ! किसी भी सभ्य जावाडोक में यह व्यवहार्य है। – Stephan

+0

यह उद्धृत किया गया है क्योंकि इसे और भी अनदेखा किया जाता है, लेकिन यह एक पुनर्विक्रय के साथ किया जा सकता है। – MPelletier

16

टेक्स्ट के रूप में सहेजी गई तारीख (20/10/2013 03:26) क्वेरी करने और तिथियों के बीच रिकॉर्ड चुनने के लिए?

बेहतर संस्करण है:

SELECT TIMSTARTTIMEDATE 
FROM TIMER 
WHERE DATE(substr(TIMSTARTTIMEDATE,7,4) 
||substr(TIMSTARTTIMEDATE,4,2) 
||substr(TIMSTARTTIMEDATE,1,2)) 
BETWEEN DATE(20131020) AND DATE(20131021); 

substr 20/10/2013 से 20,131,020 दिनांक स्वरूप DATE (20,131,021) देता है - कि SQL तिथियों के साथ काम करने और दिनांक और समय फ़ंक्शन का उपयोग करता है।

या

SELECT TIMSTARTTIMEDATE 
FROM TIMER 
WHERE DATE(substr(TIMSTARTTIMEDATE,7,4) 
||'-' 
||substr(TIMSTARTTIMEDATE,4,2) 
||'-' 
||substr(TIMSTARTTIMEDATE,1,2)) 
BETWEEN DATE('2013-10-20') AND DATE('2013-10-21'); 

और यहाँ एक पंक्ति

SELECT TIMSTARTTIMEDATE FROM TIMER WHERE DATE(substr(TIMSTARTTIMEDATE,7,4)||'-'||substr(TIMSTARTTIMEDATE,4,2)||'-'||substr(TIMSTARTTIMEDATE,1,2)) BETWEEN DATE('2013-10-20') AND DATE('2013-10-21'); 
0

यह fecha के लिए है में है (पाठ) प्रारूप तिथि YYYY-MM-dd HH: mm: उदाहरण के लिए एस एस मैं चाहता हूँ सब Ene-05-2014 के रिकॉर्ड (2014-01-05):

SELECT 
fecha 
FROM 
Mytable 
WHERE 
DATE(substr(fecha ,1,4) ||substr(fecha ,6,2)||substr(fecha ,9,2)) 
BETWEEN 
DATE(20140105) 
AND 
DATE(20140105); 
3

यूडीएफ दृष्टिकोण मेरी प्राथमिकता भंगुर substr वैल की तुलना में है ues।

#!/usr/bin/env python3 
import sqlite3 
from dateutil import parser 
from pprint import pprint 


def date_parse(s): 
    ''' Converts a string to a date ''' 
    try: 
     t = parser.parse(s, parser.parserinfo(dayfirst=True)) 
     return t.strftime('%Y-%m-%d') 
    except: 
     return None 


def dict_factory(cursor, row): 
    ''' Helper for dict row results ''' 
    d = {} 
    for idx, col in enumerate(cursor.description): 
     d[col[0]] = row[idx] 
    return d 


def main(): 
    ''' Demonstrate UDF ''' 
    with sqlite3.connect(":memory:") as conn: 
     conn.row_factory = dict_factory 
     setup(conn) 

     ################################################## 
     # This is the code that matters. The rest is setup noise. 
     conn.create_function("date_parse", 1, date_parse) 
     cur = conn.cursor() 
     cur.execute(''' select "date", date_parse("date") as parsed from _test order by 2; ''') 
     pprint(cur.fetchall()) 
     ################################################## 

def setup(conn): 
    ''' Setup some values to parse ''' 
    cur = conn.cursor() 

    # Make a table 
    sql = ''' 
    create table _test (
     "id" integer primary key, 
     "date" text 
    ); 
    ''' 
    cur.execute(sql) 

    # Fill the table 
    dates = [ 
     '2/1/03', '03/2/04', '4/03/05', '05/04/06', 
     '6/5/2007', '07/6/2008', '8/07/2009', '09/08/2010', 
     '2-1-03', '03-2-04', '4-03-05', '05-04-06', 
     '6-5-2007', '07-6-2008', '8-07-2009', '09-08-2010', 
     '31/12/20', '31-12-2020', 
     'BOMB!', 
    ] 
    params = [(x,) for x in dates] 
    cur.executemany(''' insert into _test ("date") values(?); ''', params) 


if __name__ == "__main__": 
    main() 

यह आपको इन परिणाम देगा:

[{'date': 'BOMB!', 'parsed': None}, 
{'date': '2/1/03', 'parsed': '2003-01-02'}, 
{'date': '2-1-03', 'parsed': '2003-01-02'}, 
{'date': '03/2/04', 'parsed': '2004-02-03'}, 
{'date': '03-2-04', 'parsed': '2004-02-03'}, 
{'date': '4/03/05', 'parsed': '2005-03-04'}, 
{'date': '4-03-05', 'parsed': '2005-03-04'}, 
{'date': '05/04/06', 'parsed': '2006-04-05'}, 
{'date': '05-04-06', 'parsed': '2006-04-05'}, 
{'date': '6/5/2007', 'parsed': '2007-05-06'}, 
{'date': '6-5-2007', 'parsed': '2007-05-06'}, 
{'date': '07/6/2008', 'parsed': '2008-06-07'}, 
{'date': '07-6-2008', 'parsed': '2008-06-07'}, 
{'date': '8/07/2009', 'parsed': '2009-07-08'}, 
{'date': '8-07-2009', 'parsed': '2009-07-08'}, 
{'date': '09/08/2010', 'parsed': '2010-08-09'}, 
{'date': '09-08-2010', 'parsed': '2010-08-09'}, 
{'date': '31/12/20', 'parsed': '2020-12-31'}, 
{'date': '31-12-2020', 'parsed': '2020-12-31'}] 

कुछ भी इस मजबूत की SQLite बराबर substr और instr कॉल है कि आप से बचना चाहिए की एक उलझ बुनाई है।

0

मैं तारीख को 'डीडी-मॉन-वाईवायवाई प्रारूप (10-जून-2016) के रूप में संग्रहीत कर रहा हूं और नीचे 2 दिनों के बीच रिकॉर्ड खोजने के लिए क्वेरी के नीचे काम करता हूं।

select date, substr(date,8,11) || '-' || substr(date,4,4) || substr(date, 1,2), case 
substr(date, 4,3) 
when 'Jan' then strftime('%s', replace(substr(date,8,11) || '-' || substr(date,4,4) || substr(date, 1,2), 'Jan' , '01')) 
when 'Feb' then strftime('%s', replace(substr(date,8,11) || '-' || substr(date,4,4) || substr(date, 1,2), 'Feb' , '02')) 
when 'Mar' then strftime('%s', replace(substr(date,8,11) || '-' || substr(date,4,4) || substr(date, 1,2), 'Mar' , '03')) 
when 'Apr' then strftime('%s', replace(substr(date,8,11) || '-' || substr(date,4,4) || substr(date, 1,2), 'Apr' , '04')) 
when 'May' then strftime('%s', replace(substr(date,8,11) || '-' || substr(date,4,4) || substr(date, 1,2), 'May' , '05')) 
when 'Jun' then strftime('%s', replace(substr(date,8,11) || '-' || substr(date,4,4) || substr(date, 1,2), 'Jun' , '06')) 
when 'Jul' then strftime('%s', replace(substr(date,8,11) || '-' || substr(date,4,4) || substr(date, 1,2), 'Jul' , '07')) 
when 'Aug' then strftime('%s', replace(substr(date,8,11) || '-' || substr(date,4,4) || substr(date, 1,2), 'Aug' , '08')) 
when 'Sep' then strftime('%s', replace(substr(date,8,11) || '-' || substr(date,4,4) || substr(date, 1,2), 'Sep' , '09')) 
when 'Oct' then strftime('%s', replace(substr(date,8,11) || '-' || substr(date,4,4) || substr(date, 1,2), 'Oct' , '10')) 
when 'Nov' then strftime('%s', replace(substr(date,8,11) || '-' || substr(date,4,4) || substr(date, 1,2), 'Nov' , '11')) 
when 'Dec' then strftime('%s', replace(substr(date,8,11) || '-' || substr(date,4,4) || substr(date, 1,2), 'Dec' , '12')) 
else '0' end as srcDate from payment where srcDate >= strftime('%s', '2016-07-06') and srcDate <= strftime('%s', '2016-09-06'); 
1

तो स्रोत दिनांक स्वरूप संगत नहीं है वहाँ substr समारोह, उदा कुछ समस्या है:

1/1/2017या1/11/2017या11/11/2017या1/1/17 आदि

तो मैंने एक अस्थायी तालिका का उपयोग कर एक अलग apporach का पालन किया। यह स्निपेट मौजूद है 'YYYY-MM-DD' + समय मौजूद है।

ध्यान दें कि यह संस्करण दिन/महीना/वर्ष प्रारूप स्वीकार करता है। यदि आप महीना/दिन/वर्ष चाहते हैं तो पहले दो चर DayPart और MonthPart स्वैप करें। इसके अलावा, दो साल की तिथियां '44-99 'मानती हैं 1 944-1999 जबकि '00 -43 43-2043 मानती है।

BEGIN; 

    CREATE TEMP TABLE [DateconvertionTable] (Id TEXT PRIMARY KEY, OriginalDate TEXT , SepA INTEGER, DayPart TEXT,Rest1 TEXT, SepB INTEGER, MonthPart TEXT, Rest2 TEXT, SepC INTEGER, YearPart TEXT, Rest3 TEXT, NewDate TEXT); 
    INSERT INTO [DateconvertionTable] (Id,OriginalDate) SELECT SourceIdColumn, SourceDateColumn From [SourceTable]; 

    --day Part (If day is first) 

    UPDATE [DateconvertionTable] SET SepA=instr(OriginalDate ,'/'); 
    UPDATE [DateconvertionTable] SET DayPart=substr(OriginalDate,1,SepA-1) ; 
    UPDATE [DateconvertionTable] SET Rest1=substr(OriginalDate,SepA+1); 

    --Month Part (If Month is second) 

    UPDATE [DateconvertionTable] SET SepB=instr(Rest1,'/'); 
    UPDATE [DateconvertionTable] SET MonthPart=substr(Rest1, 1,SepB-1); 
    UPDATE [DateconvertionTable] SET Rest2=substr(Rest1,SepB+1); 

    --Year Part (3d) 

    UPDATE [DateconvertionTable] SET SepC=instr(Rest2,' '); 

      --Use Cases In case of time string included 
    UPDATE [DateconvertionTable] SET YearPart= CASE WHEN SepC=0 THEN Rest2 ELSE substr(Rest2,1,SepC-1) END; 

      --The Rest considered time 
    UPDATE [DateconvertionTable] SET Rest3= CASE WHEN SepC=0 THEN '' ELSE substr(Rest2,SepC+1) END; 

      -- Convert 1 digit day and month to 2 digit 
    UPDATE [DateconvertionTable] SET DayPart=0||DayPart WHERE CAST(DayPart AS INTEGER)<10; 
    UPDATE [DateconvertionTable] SET MonthPart=0||MonthPart WHERE CAST(MonthPart AS INTEGER)<10; 

      --If there is a need to convert 2 digit year to 4 digit year, make some assumptions... 
    UPDATE [DateconvertionTable] SET YearPart=19||YearPart WHERE CAST(YearPart AS INTEGER)>=44 AND CAST(YearPart AS INTEGER)<100; 
    UPDATE [DateconvertionTable] SET YearPart=20||YearPart WHERE CAST(YearPart AS INTEGER)<44 AND CAST(YearPart AS INTEGER)<100; 

    UPDATE [DateconvertionTable] SET NewDate = YearPart || '-' || MonthPart || '-' || DayPart || ' ' || Rest3; 

    UPDATE [SourceTable] SET SourceDateColumn=(Select NewDate FROM DateconvertionTable WHERE [DateconvertionTable].id=SourceIdColumn); 
    END;