我在向SQL查询中插入日期值时遇到了一个问题。我使用的是sqlite3和python。问题是:
c.execute("""SELECT tweeterHash.* FROM tweeterHash, tweetDates WHERE
Date(tweetDates.start) > Date(?) AND
Date(tweetDates.end) > Date(?)""",
(start,end,))
查询不返回任何值,并且没有错误消息。如果我使用此查询:
^{pr2}$然后我得到我想要的值,这是预期的吗?在
值start和end来自一个文本文件:
f = open('dates.txt','r')
start = f.readline().strip('\n')
end = f.readline().strip('\n')
但我也试着声明:
start = '2014-01-01'
end = '2015-01-01'
我想我不明白为什么从start和end变量传入字符串不起作用?将日期变量传递到SQL查询的最佳方法是什么?非常感谢任何帮助。在
这些日期不一样,而且是非参数化的日期,你弄错了。在
Date(2014-01-01)
计算算术表达式2014 - 01 - 01
,然后根据得到的数字2012
构造一个Date
,这将在公元前4707年得到一些东西。在Date('2014-01-01')
,或者Date(?)
,其中参数是字符串'2014-01-01'
,构造你想要的日期,在公元2014年只需直接选择日期,您就可以更容易地看到这一点:
同时:
理想情况下,使用实际的日期对象而不是字符串。}。不要对值调用
^{pr2}$sqlite3
库知道如何处理datetime.datetime
和{Date
,只需比较它们。(是的,sqlite3可能会将它们作为字符串而不是日期进行比较,但是使用类似ISO8601格式的整个要点是,这总是给出相同的结果……当然,除非有一堆来自公元前4707年的日期。)那会有用,但我不会那样做。Python会将上进行转换,SQLite将允许您透明地将这些字符串与
date
对象转换为ISO8601格式的字符串,但不会在^{Date
函数返回的值进行比较。在您可以使用
TEXT
获得相同的效果,但是我相信您会发现它不那么令人困惑,DATETIME
会将列关联设置为NUMERIC
,这会在实际存储字符串时混淆人和其他工具。在或者您可以使用类型
DATE
-这对SQLite来说和DATETIME
一样没有意义,但是它可以告诉Python透明地将返回值转换为datetime.date
对象。请参见sqlite3
文档中的Default adapters and converters。在另外,如果你还没有读过Datatypes in SQLite Version 3和{a3},那就真的应该读了;有很多东西既令人惊讶(甚至可能特别是如果你使用过其他数据库),而且可能非常有用。在
同时,如果您认为通过传递
Date(2014-01-01)
得到了“正确”的结果,这意味着您的数据库中实际上有一堆垃圾值。也没有办法解决,因为错误是不可逆的。(毕竟,2014-01-01和2015-01-02都是2012年……)希望您不需要旧数据,或者可以重新生成它。否则,您将需要某种变通方法,以便在这种情况下尽可能有效地处理现有数据。在相关问题 更多 >
编程相关推荐