2017-08-30 30 views
0

我使用SQLite與python。我有一個數據庫有兩個字段(時間戳,閱讀)。大於比較的SQLite也返回相同的值。

時間戳是ISO8601字符串,格式如下:「YYYY-MM-DD HH:MM:SS.SSSSSS」。

當我運行該SQL查詢:

SELECT timestamp, value FROM 'readings' WHERE timestamp > datetime('2017-08-30 14:19:28.684314') 

我得到的所有地方的時間戳,因爲提供的日期,但我也得從我傳遞的日期時間讀數(在本例中的相應讀數:「 2017-08-30 14:19:28.684314')。

我的問題是爲什麼大於比較運算符假裝它是一個大於或等於運算符?

+0

嗯,而不是一個_SQLite_(事實上任何_DB_系統)專家,但有2件事情在我的腦海裏:要麼* micro * s被舍入爲6位數,要麼有一些轉換涉及日期本地化(加/減)幾小時/分鐘。 – CristiFati

+0

我曾考慮過這個問題,但是我否認了它,因爲我認爲系統會以相同的方式圍繞相同的輸入日期時間。這在理論上意味着即使舍入也不應該將輸入值作爲有效的響應返回。 – badrobit

回答

0

我解決了這個問題。我會在這裏詳細說明它是否對別人有幫助。

它與我的查詢。 SQLite沒有日期或日期時間的直接類型。

我的舊的查詢:

SELECT timestamp, value FROM 'readings' WHERE timestamp > datetime('2017-08-30 14:19:28.684314') 

含蓄地依靠SQL弄清楚的是,時間戳場是一個日期。 SQLite在內部將它們存儲爲TEXT字段。

當我修改我的查詢到以下幾點:

SELECT timestamp, value FROM 'readings' WHERE datetime(timestamp) > datetime('2017-08-30 14:19:28.684314') 

我開始,我期待的結果。

1

SQLite沒有單獨的時間戳數據類型。

datetime()回報只是SQLite中的默認格式的字符串:

> select datetime('2017-08-30 14:19:28.684314'); 
2017-08-30 14:19:28 

這不包括毫秒。因此,比較結束於毫秒的字符串與沒有毫秒的字符串之間;第一個更大,因爲(在前19個字符相等之後)它具有更多字符。

在兩個值上調用datetime()都會從兩個值中移除毫秒。 對這兩個值分別調用datetime()或直接進行比較可能會更好。

相關問題