Python2.7 & SQLite3:DELETE & SELECT with DATE(SUBSTR()) 不工作
Python2.7 & SQLite3: DELETE & SELECT with DATE(SUBSTR()) DO NOT working
首先,我在 SQLlite3 中有一个 table,有两个字段 CAR (TEXT NOT NULL)
、checkout (TEXT NOT NULL)
car checkout
red %d%d/%m%m/%Y (for example 27/09/2021)
其次,我写了一个脚本,当我运行它的结构时,所有当前日期等于或大于checkout的条目都被删除。
第三,在与 SELECT 相同的脚本中检查汽车是否在列表中并且结帐大于当前日期从我的可用汽车中排除。
第一步的代码片段如下:
try:
con = lite.connect(DB)
with con:
paper=[]
cur=con.cursor()
cur.execute("DELETE FROM CHECK_TABLE WHERE DATE(substr(checkout,7,4)||substr(checkout,4,2)||substr(checkout,1,2))<=DATE(strftime('%Y%m%d',date('now')))")
con.commit()
print('Entries with old dates deleted.')
except lite.Error as e:
print('Error connection: ',e)
问题是没有删除任何东西。奇怪的行为首先是 SQL 查询在数据库浏览器中有效,
Image: Proof DB Browser in Windows 10 - Python2.7 - SQLite3
第二个奇怪的行为是没有错误出现 第三个奇怪的是我两天前测试过并且工作正常!我真的需要你想法。
同样的逻辑在下面的代码片段中,这是我上面用 SELECT 命令描述的第三步。
def ReadDateAndCar(car):
try:
con = lite.connect(DB)
with con:
paper=[]
cur=con.cursor()
cur.execute("SELECT DISTINCT car FROM CHECK_TABLE WHERE car='"+car+"' AND DATE(substr(checkout,7,4)||substr(checkout,4,2)||substr(checkout,1,2))<=DATE(strftime('%Y%m%d',date('now')))")
free_cars=cur.fetchall()
return free_cars
except lite.Error as e:
print('Error connection: ',e)
return 0
完全相同的问题。 SQL 查询工作正常,没有出现 python 错误,它在几天前工作。有没有大神能指教一下?
你的两个查询都是错误的,它们在 DB Browser 中也不起作用。
你应该做的是以 ISO 格式 YYYY-MM-DD
存储日期,因为这是唯一与 SQLite 的日期时间函数如 date()
和 strftime()
兼容的文本日期格式,并且它具有可比性。
如果您使用任何其他格式,这些函数的结果是 null
,这就是您的情况。
表达式 substr(checkout,7,4)||substr(checkout,4,2)||substr(checkout,1,2)
和 strftime('%Y%m%d',date('now'))
return 的日期格式为 YYYYMMDD
,如果您在 date()
或 strftime()
中使用它们结果是 null
.
由于您以 YYYYMMDD
格式获得不等式两边的日期,因此它们可以直接比较,因此您不应使用函数 date()
.
条件应该是:
substr(checkout, -4) || substr(checkout, 4, 2) || substr(checkout, 1, 2) <= strftime('%Y%m%d', 'now')
首先,我在 SQLlite3 中有一个 table,有两个字段 CAR (TEXT NOT NULL)
、checkout (TEXT NOT NULL)
car checkout
red %d%d/%m%m/%Y (for example 27/09/2021)
其次,我写了一个脚本,当我运行它的结构时,所有当前日期等于或大于checkout的条目都被删除。
第三,在与 SELECT 相同的脚本中检查汽车是否在列表中并且结帐大于当前日期从我的可用汽车中排除。
第一步的代码片段如下:
try:
con = lite.connect(DB)
with con:
paper=[]
cur=con.cursor()
cur.execute("DELETE FROM CHECK_TABLE WHERE DATE(substr(checkout,7,4)||substr(checkout,4,2)||substr(checkout,1,2))<=DATE(strftime('%Y%m%d',date('now')))")
con.commit()
print('Entries with old dates deleted.')
except lite.Error as e:
print('Error connection: ',e)
问题是没有删除任何东西。奇怪的行为首先是 SQL 查询在数据库浏览器中有效, Image: Proof DB Browser in Windows 10 - Python2.7 - SQLite3 第二个奇怪的行为是没有错误出现 第三个奇怪的是我两天前测试过并且工作正常!我真的需要你想法。
同样的逻辑在下面的代码片段中,这是我上面用 SELECT 命令描述的第三步。
def ReadDateAndCar(car):
try:
con = lite.connect(DB)
with con:
paper=[]
cur=con.cursor()
cur.execute("SELECT DISTINCT car FROM CHECK_TABLE WHERE car='"+car+"' AND DATE(substr(checkout,7,4)||substr(checkout,4,2)||substr(checkout,1,2))<=DATE(strftime('%Y%m%d',date('now')))")
free_cars=cur.fetchall()
return free_cars
except lite.Error as e:
print('Error connection: ',e)
return 0
完全相同的问题。 SQL 查询工作正常,没有出现 python 错误,它在几天前工作。有没有大神能指教一下?
你的两个查询都是错误的,它们在 DB Browser 中也不起作用。
你应该做的是以 ISO 格式 YYYY-MM-DD
存储日期,因为这是唯一与 SQLite 的日期时间函数如 date()
和 strftime()
兼容的文本日期格式,并且它具有可比性。
如果您使用任何其他格式,这些函数的结果是 null
,这就是您的情况。
表达式 substr(checkout,7,4)||substr(checkout,4,2)||substr(checkout,1,2)
和 strftime('%Y%m%d',date('now'))
return 的日期格式为 YYYYMMDD
,如果您在 date()
或 strftime()
中使用它们结果是 null
.
由于您以 YYYYMMDD
格式获得不等式两边的日期,因此它们可以直接比较,因此您不应使用函数 date()
.
条件应该是:
substr(checkout, -4) || substr(checkout, 4, 2) || substr(checkout, 1, 2) <= strftime('%Y%m%d', 'now')