2012-01-12 82 views
1

我有一個匹配表。該表具有名爲matchdate的列,該列是datetime字段。如何將一整天匹配到日期時間字段?

如果非要2011-12-01 3場比賽:

  • 2011-12-01 12:00:00
  • 2011-12-01 13點25分00秒
  • 2011-12-01 16:00:00

如何查詢?如何查詢單個日期的所有匹配?

我已經看過date_trunc()to_char()
是不是有一些"select * where datetime in date"功能?

回答

5

如果您想要簡單的語法,請將timestamp的值轉換爲date。就像這樣:

SELECT * 
FROM tbl 
WHERE timestamp_col::date = '2011-12-01'; -- date literal 

然而,與大表,這將是更快:

SELECT * 
FROM tbl 
WHERE timestamp_col >= '2011-12-01 0:0' -- timestamp literal 
AND timestamp_col < '2011-12-02 0:0'; 

原因:第二個查詢沒有在表中變換的每一個值,並且可以利用一個簡單的指數時間戳列。表達式是sargable

注意排除了上限(<而不是<=)以進行正確選擇。
可以彌補通過創建一個index on an expression這樣的:

CREATE INDEX tbl_ts_date_idx ON tbl (cast(timestamp_col AS date)); 

那麼查詢的第一個版本將是一樣快,因爲它得到。

+1

你可以得到的Rails產生半開'[2011-12-01,2011-12-02)'版本'。凡(:日期=>'2011-12-01'...'2011-12-02')',雙點範圍將使用[2011-12-01,2011-12-02]和BETWEEN。當使用'> ='和'<'時,PostgreSQL是否也會將所有東西都轉換爲日期?或者它能夠足夠聰明地知道將文字轉換爲時間戳會產生相同的效果並減少工作量? – 2012-01-12 18:47:02

+0

@ muistooshort:Postgres在這種情況下足夠聰明。這將導致我的第二個查詢。 – 2012-01-12 22:06:02

1

不知道如果我失去了一些東西很明顯這裏,但我想你可以只

select * from table where date_trunc('day', ts) = '2011-12-01'; 
0

只需使用SQL函數之間,像這樣:

SELECT * FROM table WHERE date BETWEEN '2011-12-01' AND '2011-12-02' 

您可能需要包括倍日期文字,但這應該包括情人限制並排除上限。

從鐵軌我相信你能做到:

.where(:between => '2011-12-01'..'2011-12-02') 
+0

你想要'.where(:date =>'2011-12-01'...'2011-12-02')':':date''而不是':between'和一個三點範圍內的半開放[2011-12-01,2011-12-02]'間隔一個完全關閉的[2011-12-01,2011-12-02]'區間。 '..'確實在SQL中作爲BETWEEN結束,'...'最後使用'> ='/'<'對結束。 – 2012-01-12 18:38:30

相關問題