2009-07-12 80 views
22

我一直在使用unix時間戳。從PHP中存儲MySQL日期的最佳實踐

我喜歡它,因爲它很容易比較,速度很快,因爲我將它作爲整數存儲。而且由於我使用的是PHP,我可以使用unixtimestamp中的date()函數獲取任何日期/時間格式。

現在,有人說最好使用DATETIME格式。但除了更適合的名字,我沒有看到任何優勢。

使用DATETIME確實比較好,如果是的話,有什麼優勢?

謝謝。

回答

28

如果您將日期作爲Unix時間戳存儲在數據庫中,那麼您會給自己沉重的負擔。您必須將它們轉換爲您要使用的格式,您必須在日期範圍之間進行計算,您必須構建查詢以獲取範圍內的數據。這似乎與直覺相反 - 當然,你的「程序員時間」最好花在解決實際問題上?

看起來好得多的做法是將日期和時間以MySQL可用的正確格式存儲,然後使用數據庫函數爲您想要的數據創建查詢。浪費時間做所有轉換和浪費的時間相對於下午花費的閱讀(和理解)來說是巨大的11.6 MySQL Date and Time Functions

+0

我站好了。 :) – treznik 2009-07-13 07:43:04

+1

我不同意。檢查我的答案。 – coderama 2014-11-07 06:08:40

7

使用MySQL date/time types的一個優點是能夠更簡單地使用date/time functions in MySQL

DATE類型的優點還在於,它僅存儲日,月和年,因此不會浪費空間或比較併發症,因爲在您只關心當天而不是時間的情況下,時間。

就我個人而言,我傾向於使用數據庫作爲數據轉儲,因此這些功能沒有多大意義。在PHP中,我傾向於以整數格式存儲日期,這與您陳述的原因很相似。

1

比較容易,mysql提供了很多日期函數。

2

更容易維護是一個優點。看到你的實際日期:

select * from table where ... 

是相當不錯的。

3

使用數據庫日期時間更有效,因爲每次需要查詢時都需要應用from_unixtime()函數從表的unix日期時間列中提取數據。在where子句中使用此函數將完全忽略任何索引用法。

說我的查詢是:

選擇COL1,COL2,colUnixdatetime from表where wtvdate1之間colUnixdatetime和wtvdate2

我需要運行:

選擇COL1,COL2,colUnixdatetime from表where from_Unixtime(colUnixdatetime)wtvdate1和wtvdate2之間

這上面的查詢將完全忽略任何索引,以及沒有使用索引在這裏,因爲他們永遠不會被使用因爲我將永遠需要我們e是獲取真實日期時間的函數。

任何在where子句中用於LHS條件的內置函數都不會使用任何索引,並且如果您有一個巨大的表,您的查詢將花費更長的時間。

6

@Smita V,您引用的低效查詢只是如此,因爲您將轉換函數錯誤地應用於每個錶行,您應將其應用於條件本身。所以,而不是

select col1,col2,colUnixdatetime from table where From_Unixtime(colUnixdatetime) between wtvdate1 and wtvdate2 

,其中轉換表上的每一行,以比較它與你得到的日期。你應該使用

select col1,col2,colUnixdatetime from table where colUnixdatetime between UNIX_TIMESTAMP(wtvdate1) and UNIX_TIMESTAMP(wtvdate2). 

這樣做會使用適當的表索引。

@treznik前一陣子我從一個uts整數移動到一個日期時間或時間戳數據類型,出於上述原因,因爲他們更容易閱讀和操作(我做了很多直接表訪問)。不過我最近開始重新考慮這種做法的原因有兩個:

  1. 沒有時區位置存儲,所以你推斷基於位置的時區。這對你來說可能是也可能不是問題。
  2. 它忽略夏令時。所以,當時鍾在凌晨2點回來時,你會在凌晨1點半得到兩次,並說2011-10-30 01:30不會讓你知道這一點,而1319938200則會。我不認爲有一個本地的方式在MySQL中存儲包括時區在內的日期,除了作爲一個字符串(2011-10-30 01:30 BST)。

我還在試圖找出答案,我自己。

8

我一直都是unix時間戳的狂熱粉絲。但我認爲正確的答案是:「依賴」。我最近做了一個表格數據庫,我只想列出URL。會有一個日期字段,但日期字段純粹是爲了排序。我通過last_crawled命令。這意味着我永遠不會在該字段上使用任何內置日期函數。這只是一個簡單的方法來獲取最早的條目,我絕不會將日期函數應用於此字段。現在,有我在此日期字段,我就失去了兩件事情:

  1. 時間字段是一個整數
  2. 一個整數排序的兩倍快(不是100%肯定的這個,pending outcome of this question

但是,對於另一個系統,我不得不存儲交易信息。這使得使用internal mysql date functions成爲可能,這在我們開始做報告時變得非常有用。