2个日期之间的Sqlite查询保存为文本

时间:2017-09-22 02:44:21

标签: python python-3.x sqlite

我的数据库有一个名为Fecha的列,用于保存为dd/mm/yyyy字符串(TEXT)的日期记录(请注意/,而不是dd-mm-yyyy)。这可能听起来令人困惑所以请查看附带的截图。

列的类型:

enter image description here 一些记录的样本:

enter image description here

现在,我的目标是在两个日期之间进行查询,所以在我完成所有研究之后,我最终到了这里:

SELECT * 
FROM Facturas 
WHERE substr(Fecha,7)||'/'||substr(Fecha,4,2)||'/'||substr(Fecha,1,2) 
BETWEEN '01/01/2001' AND '12/09/2099'

然而,这不起作用,我不明白为什么。任何线索?
另请注意:我无法将该列的存储转换为yyyy-mm-dd,因为我需要以这种方式专门存储的数据。

修复: BETWEEN之后的两个值也必须使用yyyy / mm / dd,所以我只是按照这种方式运行它现在可以正常工作。

def reverse_date(date)
    split = date.split("/")
    return split[2] + "/" + split[1] + "/" + split[0]

1 个答案:

答案 0 :(得分:1)

首先,我创建一个有点像你的桌子。

>>> import sqlite3
>>> conn = sqlite3.connect(':memory:')
>>> c = conn.cursor()
>>> c.execute('''CREATE TABLE Facturas (Fecha TEXT, Something INTEGER)''')
<sqlite3.Cursor object at 0x00000000067D2110>
>>> from datetime import datetime
>>> for d in range(1,31):
...     c.execute('''INSERT INTO Facturas VALUES (?,?)''', (datetime(2017,6,d).strftime('%d/%m/%Y'), d))
...     

这会验证日期与您表格中的日期类似。

>>> for row in c.execute('''SELECT * FROM Facturas'''):
...     print(row)
...     
('01/06/2017', 1)
('02/06/2017', 2)
('03/06/2017', 3)
('04/06/2017', 4)
('05/06/2017', 5)
('06/06/2017', 6)
('07/06/2017', 7)
('08/06/2017', 8)
('09/06/2017', 9)
('10/06/2017', 10)
('11/06/2017', 11)
('12/06/2017', 12)
('13/06/2017', 13)
('14/06/2017', 14)
('15/06/2017', 15)
('16/06/2017', 16)
('17/06/2017', 17)
('18/06/2017', 18)
('19/06/2017', 19)
('20/06/2017', 20)
('21/06/2017', 21)
('22/06/2017', 22)
('23/06/2017', 23)
('24/06/2017', 24)
('25/06/2017', 25)
('26/06/2017', 26)
('27/06/2017', 27)
('28/06/2017', 28)
('29/06/2017', 29)
('30/06/2017', 30)

我选择6月6日至6月20日的记录。

>>> for row in c.execute('''SELECT *  FROM Facturas WHERE substr(Fecha,7)||'/'||substr(Fecha,4,2)||'/'||substr(Fecha,1,2) BETWEEN '2017/06/06' AND '2017/06/20' '''):
...     print(row)
... 
('06/06/2017', 6)
('07/06/2017', 7)
('08/06/2017', 8)
('09/06/2017', 9)
('10/06/2017', 10)
('11/06/2017', 11)
('12/06/2017', 12)
('13/06/2017', 13)
('14/06/2017', 14)
('15/06/2017', 15)
('16/06/2017', 16)
('17/06/2017', 17)
('18/06/2017', 18)
('19/06/2017', 19)
('20/06/2017', 20)

请注意BETWEEN运算符现在有效,因为表达式中日期的格式与日期2017/06/06和2017/06/20的格式相符。

附录:我忘了提及,这个格式不仅与BETWEEN表达式中的日期相匹配,而且还将日期部分按显着顺序排列,即年,月,日。