2016-08-18 249 views
0

我有一個PSQL數據庫,在表中有「start_time」和「end_time」字段。PostgreSQL日期範圍查詢

這些從json文件以字符串形式導入到數據庫中的文本字段。該字符串具有以下格式:yyyy-mm-dd hh:mm:ss 我想要執行一個查詢來給出數據庫中某個表在給定日期範圍內的所有ID。

要做到這一點,我可以做兩件事之一。我可以查詢給定日期範圍的開始時間和結束時間的列表,並且從該查詢返回查詢我正在查找的實際數據WHERE start_time = ANY ('{list of dates go here}')

另一個選項是計算出如何將行的格式更改爲可比較的內容。如果字段不是文本字段,則類似WHERE start_time > beginning of date range AND end_time > end of date range

日期範圍將來自網站的日期時間選擇器。

這可能是一個重複的帖子,但經過幾小時的搜索解決方案後,沒有出現任何內容。所以任何正確的方向都是有幫助的。

感謝

+0

我想我不知道你的問題是什麼,在這裏。你問是否將時間戳存儲爲時間戳或文本更好?或者你問如何將文本時間戳轉換爲時間戳時間戳? – jmelesky

+0

請勿爲不相關的事物添加標籤。這是Postgres,而不是MySQL。 – tadman

+0

添加了標籤和背景信息,以防日期在放入查詢之前或之後有更好的解決方案來處理服務器端在python中的信息或在javascript中的客戶端上的信息。然而,postgres是魔術,鮑里斯的答案正是我正在尋找的。 –

回答

1

PostgreSQL的應該去容易對你在這種情況下。只需將字符串轉換爲時間戳和比較即可。

這應該工作開箱:

WHERE start_time::timestamp > '2016-01-01' AND end_time::timestamp < '2016-12-31' 
+0

公平答案。只是兩個更正。 1.第二次比較應該是'<' not '>'。 2.對於在大數據集上的性能,您可能需要在這些文本字段上使用表達式索引。'CREATE INDEX mytable_start_time_idx ON mytable(start_time :: timestamp);' 'CREATE INDEX mytable_end_time_idx ON mytable(end_time :: timestamp);' – filiprem

+0

你說的全部都是真的。索引是正確的路要走,是的,我從問題本身複製了查詢,保留了錯誤:) –

+0

您的答案中有一個錯誤。時間戳<日期比較。我們必須意識到'2016-12-31 23:55:00'不會比'2016-12-31'更少。因此,您的查詢不會包含晚於「2016-12-31 00:00:00」的任何內容。右側應該是'end_time :: timestamp <='2016-12-31 23:59:59.999''或者更好 - 'end_time :: date <='2016-12-31''(這樣更簡單) 。 – filiprem