我的数据库有一个名为Fecha
的列,用于保存为dd/mm/yyyy
字符串(TEXT)的日期记录(请注意/
,而不是dd-mm-yyyy
)。这可能听起来令人困惑所以请查看附带的截图。
列的类型:
现在,我的目标是在两个日期之间进行查询,所以在我完成所有研究之后,我最终到了这里:
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]
答案 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表达式中的日期相匹配,而且还将日期部分按显着顺序排列,即年,月,日。