簡體   English   中英

Python SQLite,在SQL查詢中傳遞日期值

[英]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.datetimedatetime.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM