幾年前,我聽說sql中的截斷日期並不是一個好習慣。真的嗎?使用date_trunc的缺點
我需要從「yyyy-MM-dd」格式的表中獲取日期類型列的值,日期當前存儲在表中,其中「yyyy-MM-dd hh:mm:ss」格式
幾年前,我聽說sql中的截斷日期並不是一個好習慣。真的嗎?使用date_trunc的缺點
我需要從「yyyy-MM-dd」格式的表中獲取日期類型列的值,日期當前存儲在表中,其中「yyyy-MM-dd hh:mm:ss」格式
這是不好的做法,存儲在任何一種格式,因爲你應該把它保存爲timestamp
or timestamp with time zone
不是text
或varchar
然後,來獲得日期,只投:
SELECT col::date
請注意,「日期」取決於您當前的時區的設置。
更多:
沒有什麼錯在正常情況下使用date_trunc
。
主要問題是涉及b-tree索引的地方。如果您有some_timestamp
索引,並且您搜索date_trunc('day', some_timestamp) = DATE '2012-01-01'
,則PostgreSQL不能使用索引。 (理論上可以將date_trunc
表達式重寫爲可索引範圍謂詞,但它不會)。
如果改爲寫:
some_timestamp >= DATE '2012-01-01' AND some_timestamp < DATE '2012-01-02'
那麼它的B樹索引的。 (請注意,我故意沒有使用BETWEEN
,因爲它包含在內)。
創建表達式索引有時很有用。
create index blahindex on blahtable (date_trunc('day', some_timestamp));
但因爲每個額外的索引具有維護成本,最好只寫你的謂詞是正常的列索引,其中可能易於使用。
我在Oracle中使用了很多,並沒有看到問題出在哪裏。你認爲將時間戳轉換爲具有所需模式的日期更好嗎? – AndreDuarte 2014-09-19 14:00:10
是的,這就是我所聽到的 – 2014-09-19 14:01:13