pythonsqlite,在sql查询中传递日期值

2024-10-01 09:35:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我在向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查询的最佳方法是什么?非常感谢任何帮助。在


Tags: andfromexecutesqlreadlinedate错误where
1条回答
网友
1楼 · 发布于 2024-10-01 09:35:03

这些日期不一样,而且是非参数化的日期,你弄错了。在

Date(2014-01-01)计算算术表达式2014 - 01 - 01,然后根据得到的数字2012构造一个Date,这将在公元前4707年得到一些东西。在

Date('2014-01-01'),或者Date(?),其中参数是字符串'2014-01-01',构造你想要的日期,在公元2014年

只需直接选择日期,您就可以更容易地看到这一点:

>>> cur.execute('SELECT Date(2014-01-01), Date(?)', ['2014-01-01'])
>>> print(cur.fetchone())
('-4707-05-28', '2014-01-01')

同时:

What is the best way to pass a date variable into a SQL query?

理想情况下,使用实际的日期对象而不是字符串。sqlite3库知道如何处理datetime.datetime和{}。不要对值调用Date,只需比较它们。(是的,sqlite3可能会将它们作为字符串而不是日期进行比较,但是使用类似ISO8601格式的整个要点是,这总是给出相同的结果……当然,除非有一堆来自公元前4707年的日期。)

^{pr2}$

And would this also mean that when I create the table, I would want: " start datetime, end datetime, "?

那会有用,但我不会那样做。Python会将date对象转换为ISO8601格式的字符串,但不会在^{上进行转换,SQLite将允许您透明地将这些字符串与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年……)希望您不需要旧数据,或者可以重新生成它。否则,您将需要某种变通方法,以便在这种情况下尽可能有效地处理现有数据。在

相关问题 更多 >