Sqlite将字符串转换为日期

Cla*_*dio 36 sqlite string date date-format

我将日期存储为sqlite数据库中的字符串,如"28/11/2010".我想将字符串转换为日期.

具体来说,我必须在两个日期之间转换大量的字符串日期.

在postgresql中,我使用to_date('30/11/2010','dd/MM/yyyy'),如何用sqlite做同样的事情?

像这样的东西:

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')
Run Code Online (Sandbox Code Playgroud)

小智 65

由于Sqlite 没有日期类型,您需要进行字符串比较才能实现此目的.要做到这一点你需要扭转顺序 - 例如从dd/MM/yyyy到yyyyMMdd,使用像

where substr(column,7)||substr(column,4,2)||substr(column,1,2) 
      between '20101101' and '20101130'
Run Code Online (Sandbox Code Playgroud)


小智 18

保存日期为TEXT(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);
Run Code Online (Sandbox Code Playgroud)

2013年10月20日的substr给出了20131020日期格式DATE(20131021) - 这使得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');
Run Code Online (Sandbox Code Playgroud)

这是一行

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');
Run Code Online (Sandbox Code Playgroud)


MPe*_*ier 10

你应该研究的一件事是SQLite日期和时间函数,特别是如果你将不得不操纵很多日期.这是使用日期的理智方式,代价是更改内部格式(必须是ISO,即yyyy-MM-dd).

  • 这个文档被反复引用......但是,IMO需要重新编写才能快速找到信息.所有有意义的细节都埋没了 例如,是否有可能在不到10秒的时间内确定strftime函数的返回类型......?不!在任何体面的javadoc中都是可行的. (4认同)

mat*_*mc3 5

与脆性相比,UDF 方法是我的首选 substr值。

#!/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()
Run Code Online (Sandbox Code Playgroud)

这将为您提供以下结果:

[{'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'}]
Run Code Online (Sandbox Code Playgroud)

SQLite 等价于任何这种健壮的东西是你应该避免的混乱的编织substrinstr调用。