2009-06-10 167 views
19

我通常在MySQL數據庫中使用PHP的time()函數將日期存儲爲整數,而不是使用MySQL的日期格式,僅僅是因爲當我將它拉出時更容易操作,但是這樣做有什麼缺點嗎?MySQL日期或PHP時間?

回答

24

範圍:

總是有明顯的缺點:您可以存儲的範圍是有限的起價1970至2038年。如果你需要存儲此範圍之外的日期,您通常需要使用另一格式。我發現最常見的情況適用於生日。

可讀性:

我認爲最重要的原因是人們選擇使用它的數據很容易解釋,內置日期類型之一。你可以做一個簡單的選擇,並理解這些值,而不必進一步格式化響應。

指標:

了良好的技術理由使用的日期類型是,它允許對索引的查詢在某些情況下,知道unix時間戳沒有。考慮下面的查詢:

SELECT * FROM tbl WHERE year(mydate_field) = 2009; 

如果mydate_field是土生土長的日期類型的,還有在球場上的索引,該查詢實際使用的索引,儘管函數調用。這幾乎是唯一一次mysql可以優化像這樣的字段上的函數調用。在時間戳字段對應的查詢將不能使用索引:

SELECT * FROM tbl WHERE year(from_unixtime(mytimestamp_field)) = 2009; 

如果你想想看一下,有辦法解決它,但。該查詢做同樣的事情,並可以使用索引優化:

SELECT * FROM tbl WHERE mytimestamp_field > unix_timestamp("2009-01-01") AND mytimestamp_field < unix_timestamp("2010-01-01"); 

計算:

一般來說,我存儲日期爲UNIX時間,儘管缺點。這不是基於它的優點,而是因爲我習慣了它。我發現這簡化了一些計算,但使其他計算複雜化。例如,由於每月的秒數不同,因此很難將一個月添加到unix時間戳。使用mysql DATE_ADD()函數非常簡單。但是,我認爲在大多數情況下,它實際上簡化了計算。例如,你想從最後兩天選擇帖子是相當普遍的。如果該字段包含Unix時間戳這可以通過簡單地做容易實現:

SELECT * FROM tbl WHERE mytimestamp_field > time() - 2*24*3600; 

這可能是一個風格問題,但我個人覺得這更快,更容易比必須的rember如DATE_SUB一個函數的語法()。

時區:

Unix的時間戳不能存儲時間段數據。我住在瑞典有一個時區,所以這對我來說不是問題。但是,如果你生活在一個跨越多個時區的國家,這可能是一大痛苦。

+0

我只想說「+1」提到UNIX_TIMESTAMP和FROM_UNIXTIME函數......實質上給你兩全其美。 – Narcissus 2009-06-11 11:07:39

4

我曾經這樣做過,但現在我將它作爲MySQL DateTime存儲 - 僅僅因爲這意味着當查看數據庫中的原始數據時,我可以輕鬆解釋它。

除此之外,使用其他語言的數據可能更容易處理,而其他語言不會像UNIX那樣嚴重使用UNIX時間戳,但這兩種方法都沒有太大的牽引力。

9

一個缺點是,您將無法使用SQL函數操作和查詢 這些日期。

0

這不是太糟糕,但你會失去一些內置的功能,如:

SELECT * FROM表1,其中dateColumn = GETDATE() - 30

使用日期時間,如果你能!

1

只有幾個我能想到的:
*如果另一個非php應用程序需要使用數據庫,這將是一個難以閱讀的格式。
*如果你想在這些日期做任何基於SQL的工作(例如添加一個月或者獲取特定年份的所有值等),這將更加困難。

+0

幾乎所有常見的語言都內置了劃時代的時間支持。 – 2009-06-10 20:37:23

1

細節的輕微損失。 MySQL Datetime變量可以非常精確。另外,如果你將不得不在數據庫中比較日期,日期格式有一些你不能使用的內置函數。

+0

我希望看到您的聲明DATETIME更準確的參考。 – 2009-06-10 20:40:33

+1

你的意思是更精確的time()函數? 1)http://be2.php.net/manual/en/function.time.php和2)http://dev.mysql.com/doc/refman/5.1/en/datetime.html時間()去其次,MySQL日期時間變爲微秒。 – KdgDev 2009-06-11 00:29:42

3

對於您能夠存儲的日期範圍,UNIX時間戳具有明顯的限制。

我現在也總是使用DATETIME字段。你可以使用SQL做很多DATE數學運算,所以你可以在現在和存儲日期之間提取有用的信息,例如DATEDIFF,根本不需要任何PHP。

2

有許多缺點:

  • 的精度缺乏; Unix時間僅精確到秒,並且僅適用於使用典型32位整數的1901-12-13和2038-01-19之間的日期
  • 您不能使用任何內置數據庫函數來查詢或操縱
  • 不能存儲時區

數據如果需要time_t,它很容易轉換爲一個代碼。

1

我認爲出於可擴展性原因,最好使用Unix時間戳。

優勢

  • 總是存儲在UTC時區(如果你有多個時區,不需要轉換服務器)。
  • 應用程序將它們轉換爲首選時區(這種情況只發生在最後一級)。
  • 不是字符串(這些與整數相比是巨大的)。
  • 較少的數據庫計算(東西像created < 19345345345-24 * 60 * 60計算一次)。

編輯: MySQL時間戳沒有內部存儲爲字符串,但是當拉出數據庫的那些被轉換爲字符串。 DATETIME類型不會被MySQL修改,這意味着如果您在數據庫中放入日期,您將得到相同的結果。

如果您在一個網站上有不同時區的訪問者,您必須將日期轉換爲string-> string而不是integer-> string)。在一些國家,日期不僅僅是數字(例如在法國,它是Mardi 15 mai 2012)我更喜歡用PHP或JS來做這件事,我認爲simpe轉換integer-> string比Integer-> String-> String更快。 加上無頭痛,如果遷移到其他國家的服務器

假缺點:。

  • 我相信,Unix時間戳記的限制範圍並不侷限於實際時間戳是整數在數據庫中,所以你可以調整大小。默認情況下,unsigned整數是int(10),這意味着你可以存儲數字高達4294967295,但它的限制是不固定的,所以我們可以很容易地改變 int(10) int int(16) bigint