[英]Python SQLite, passing date values in sql query
將日期值插入SQL查詢時遇到問題。 我正在使用sqlite3和python。 查詢是:
c.execute("""SELECT tweeterHash.* FROM tweeterHash, tweetDates WHERE
Date(tweetDates.start) > Date(?) AND
Date(tweetDates.end) > Date(?)""",
(start,end,))
該查詢不返回任何值,並且沒有錯誤消息。 如果我使用此查詢:
c.execute("""SELECT tweeterHash.* FROM tweeterHash, tweetDates WHERE
Date(tweetDates.start) > Date(2014-01-01) AND
Date(tweetDates.end) > Date(2015-01-01)""")
然后我得到了想要的值,這是預期的嗎?
值的開始和結束來自文本文件:
f = open('dates.txt','r')
start = f.readline().strip('\n')
end = f.readline().strip('\n')
但我也嘗試過聲明它:
start = '2014-01-01'
end = '2015-01-01'
我想我不明白為什么從開始和結束變量中傳入字符串不起作用? 將日期變量傳遞到SQL查詢的最佳方法是什么? 任何幫助是極大的贊賞。
這些日期不相同,這是您輸入錯誤的非參數化日期。
Date(2014-01-01)
計算算術表達式2014 - 01 - 01
,然后構建一個Date
從最終號碼2012
,這將讓你在4707 BC東西。
Date('2014-01-01')
或Date(?)
其中參數為字符串'2014-01-01'
)可構造您想要的日期(在2014 AD中)。
您只需直接選擇日期,就可以更輕松地看到以下內容:
>>> cur.execute('SELECT Date(2014-01-01), Date(?)', ['2014-01-01'])
>>> print(cur.fetchone())
('-4707-05-28', '2014-01-01')
與此同時:
將日期變量傳遞到SQL查詢的最佳方法是什么?
理想情況下,使用實際的日期對象而不是字符串。 sqlite3
庫知道如何處理datetime.datetime
和datetime.date
。 並且不要在值上調用Date
,只需將它們進行比較即可。 (是的,然后sqlite3可能會將它們作為字符串而不是日期進行比較,但是使用類似ISO8601格式的要點是總是產生相同的結果……當然,除非您周圍有一堆公元前4707年的日期。) :
start = datetime.date(2014, 1, 1)
end = datetime.date(2015, 1, 1)
c.execute("""SELECT tweeterHash.* FROM tweeterHash, tweetDates WHERE
tweetDates.start > ? AND
tweetDates.end > ?""",
(start,end,))
這是否也意味着在創建表時,我想要:“開始日期時間,結束日期時間”?
那會起作用,但我不會那樣做。 Python將date
對象轉換為ISO8601格式的字符串,但不轉換回SELECT
,SQLite將允許您透明地將這些字符串與Date
函數返回的值進行比較。
使用TEXT
可以得到相同的效果,但是我相信您會發現它不那么混亂, DATETIME
會將列親和力設置為NUMERIC
,這在您實際存儲字符串時會混淆人類和其他工具。
或者,您可以使用DATE
類型-對於SQLite而言,它與DATETIME
一樣無意義,但是它可以告訴Python將返回值透明地轉換為datetime.date
對象。 請參見sqlite3
文檔中的默認適配器和轉換器 。
另外,如果您還沒有閱讀SQLite版本3中的數據類型以及SQLite和Python類型 ,那么您確實應該; 有很多事情都令人驚訝(即使您使用過其他數據庫,甚至可能尤其如此),並且可能非常有用。
同時,如果您認為通過傳遞Date(2014-01-01)
得到“正確”的結果,則意味着您實際上在數據庫中有很多垃圾值。 而且沒有辦法修復它們,因為錯誤是不可逆的。 (畢竟2014年1月1日和2015年1月2日都是2012年……)希望您要么不需要舊數據,要么可以重新生成它。 否則,您將需要某種變通方法,以便在這種情況下盡可能有效地處理現有數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.