2012-04-24 69 views
3

我有一個表datetime字段。我很難理解我如何處理這個問題,部分原因是我不明白如何將時間轉換爲數字。使用PostgreSQL處理時間

CREATE TABLE tracking.time_record 
(
    date date, 
    "time" time without time zone, 
    id character(100) 
) 

我的數據的一個例子如下:

"2012-04-18" | "18:33:19.612" | "2342342384" 

如何運行一個查詢,這樣我可以檢查所有具有id值我使用下面的命令做了一桌例如,在某一天的時間值> 10 pm

我意識到,我的時間存儲在一個字符類型變量,因此這樣的事情不工作:

SELECT * FROM tracking.time_record 
WHERE "time" > "04:33:38.884" AND date > "2012-04-18" 

(這是我的時間/日期跟蹤的第一口探井 - 我也許應該選擇不同列名)

+0

爲什麼不日期+時間合併成/時間戳沒有時區?它會使比較更容易,你可以隨時提取相關部分,如果你想要它們。 – wildplasser 2012-04-24 14:20:37

+0

這是一個很好的觀點。現在我正在更好地理解時間戳的工作方式,我將在未來做到這一點。 – djq 2012-04-24 15:30:34

回答

10

無論答案迄今捕獲您的實際問題(一個或多個)。

雖然顯式轉換爲相應類型當然不會造成傷害,但不需要。 PostgreSQL自動將一個字符串文字強制轉換爲適當的類型。

你的問題,從基本的語法錯誤幹:
雙引號標識符"MyColumn" - 只有必要應避免開始與其他非法標識符(混合的情況下,保留字,..) 。
單引號用於'string literal'

您可能會對PostgreSQL手冊的identifiersconstants的書面章節感興趣。

雖然我們在這,從未使用datetime列名。 PostgreSQL中的每個SQL標準和類型名稱都是reserved words。這會導致代碼和錯誤消息混淆。

我會建議只使用一個單一的timestamp列,而不是單獨的datetime: 你幾乎肯定不希望character(100)數據類型,不斷 - 尤其不適合的id列。這種空白填充類型基本上只是出於歷史原因。考慮textvarchar代替:

看起來是這樣的:

CREATE TABLE tbl (
    tbl_id text CHECK(length(id) <= 100) 
, ts timestamp 
); 

演員到timedate,你只需要這些組件,它的短,價格便宜:

SELECT ts::time AS the_time, ts::date AS the_date FROM tbl; 

爲了更具體的需要,使用date_trunc()extract()
要查詢有某一天時間值> 10點的... ID值:

SELECT * 
FROM tbl 
WHERE ts::time > '22:00' 
AND ts::date = '2012-04-18'; 

或者,對於任何連續的時間段:

... 
WHERE ts > '2012-04-18 22:00'::timestamp 
AND ts < '2012-04-19 00:00'::timestamp; 

第二種形式可以更好地使用ts上的普通索引,並且在大型表格的這種情況下會更快。

更多timestamp處理PostgreSQL中:

+0

順便說一句,我懷疑你實際上是想爲你的'id'使用'character(100)'。這種空白填充類型基本上只是出於歷史原因。請考慮['text或varchar'](http://www.postgresql.org/docs/current/interactive/datatype-character.html)。 – 2012-04-25 13:44:52

4

可以使用date_part函數來獲取小時

select id 
from tracking.time_record 
where date_part('hour', time) >= 22 
    and date = '2012-04-18' 

的的> = 22,而不是> 22是抓賭的時間間隔晚上10點和晚上11點。這也是晚上10:00:00。但its't很難適應查詢捉住右間隔

你有一個工作的例子here

+1

哇 - 'sqlfiddle'!謝謝。 – djq 2012-04-24 15:31:33

+0

'date_part()'也是不必要的。 '「時間」> '22:00''會。 – 2012-04-25 05:58:40

3

比較時間和日期值應在PostgreSQL的正常工作,只是確保你轉換你的字符串到合適的類型:

SELECT * FROM tracking.time_record 
WHERE "time" > time '04:33:38.884' AND "date" > date '2012-04-18' 
+0

請注意,這將在上午4:33之後的2012-04-18起發現記錄。 (所以在這一天之前什麼都沒有,也沒有任何一天在上午4:33之前)。你可能想要的是一個時間戳列。 – Andrew 2012-04-25 00:21:27

+0

在這種情況下不需要鑄造(雖然沒有傷害)。 Postgres在此自動將字符串文字強制轉換爲匹配類型。語法錯誤是問題。 – 2012-04-25 05:57:11

+0

你說得對。我仍然會推薦演員。比較字符串或日期還是別的嗎?如果不看錶格規格,你真的無法分辨。 – user1346466 2012-04-25 09:42:06