2012-08-27 63 views
3

我有一個PostgreSQL表,其字段名爲effective_date,數據類型是整數(epoch date)。我想要做的只是選擇具有我選擇的effective_date的條目(我只想按月查詢)。我的查詢在下面,問題是,雖然表中有許多條目與選擇標準相匹配,但它並未返回任何內容。PostgreSQL中的to_char()問題

$query = "select * 
      from ". $this->getTable() ." 
      where pay_stub_entry_name_id = 43 
      AND to_char(effective_date, 'Mon') = 'Jul' 
      AND deleted = 0"; 
+0

掛上,你說'effective_date'有數據類型'integer'嗎?不是'日期'?不是'時間戳'?你的問題是否是一個錯誤?如果它是一個整數,你期望如何得到一個日期?它是一個時代日期(自某個日期以來的秒數)? –

+0

@克雷格抱歉,我的錯。是的,這是一個時代的日期。 – Thili

+0

那麼,'to_char'會做什麼?你在'psql'中試過了嗎?讓我們來看看:'select to_char(extract(current_timestamp的時期),'Mon')'只輸出字符串「Mon」,它永遠不會等於字符串「Jul」。所以你的問題是,你在調用'to_char'的整數版本,並期望它知道你想把整數作爲一個日期。請參閱psql中的'\ df to_char'以查看所有'to_char'變體。只有'timestamp'的日期格式符合[documentation](http://www.postgresql.org/docs/current/static/functions-formatting.html) –

回答

3

使用extract(month from the_date)而不是to_char。請參閱datetime functions in the Pg docs

隨着to_char你會遇到各種案件,本地化等問題。

假設你的意思是說的effective_date的數據類型爲timestampdate,你會寫:

$query = "select * 
     from ". $this->getTable() ." 
     where pay_stub_entry_name_id = 43 
     AND extract(month from effective_date) = 7 
     AND deleted = 0"; 

如果是integer然後 - 假設這是具有劃時代意義的日期 - 你必須把它與轉換爲時間戳to_timestamp,然後使用extract就可以了。見epoch部分連接到上面的文檔,例如:

$query = "select * 
     from ". $this->getTable() ." 
     where pay_stub_entry_name_id = 43 
     AND extract(month from to_timestamp(effective_date)) = 7 
     AND deleted = 0"; 

你的問題的直接原因是,你調用to_char(integer,text)一個整數劃時代的日期。只有timestamp版本的to_char做日期格式; Mon對其他人不是特別的,所以它被簡單地輸出爲字符串Mon。比較:

regress=# SELECT to_char(current_timestamp, 'Mon'); 
to_char 
--------- 
Aug 
(1 row) 

regress=# select to_char(extract(epoch from current_timestamp), 'Mon'); 
to_char 
--------- 
Mon 
(1 row) 

記住參數化的現實世界的這些查詢的版本,以幫助避免SQL injection