簡體   English   中英

MySQL日期或PHP時間?

[英]MySQL date or PHP time?

我通常在MySQL數據庫中使用PHP的time()函數將日期存儲為整數而不是使用MySQL的日期格式,因為當我將其拉回時更容易操作,但這有什么缺點嗎?

范圍:

總有一個明顯的缺點:您可以存儲的范圍在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;

這可能是一個品味問題,但我個人認為這比必須重新定義DATE_SUB()等函數的語法更快更容易。

時區:

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

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

我曾經這樣做,但現在我將它存儲為MySQL DateTime - 只是因為這意味着在查看數據庫中的原始數據時我可以輕松地解釋它。

除此之外,使用其他語言(不像PHP那樣大量使用UNIX時間戳)處理數據可能更容易,但無論如何都沒有太大的吸引力。

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

我現在也總是使用DATETIME字段。 您可以使用SQL進行大量的DATE數學運算,這樣您就可以在現在和存儲的日期之間提取有用的信息,例如DATEDIFF ,而不使用任何PHP。

您可以在表定義中為MySQL的時間戳定義自動更新子句。
http://dev.mysql.com/doc/refman/5.0/en/timestamp.html

有許多缺點:

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

如果你需要time_t ,很容易在代碼中轉換為一個。

我認為出於可伸縮性的原因,最好使用Unix時間戳。

優點

  • 始終以UTC時區存儲(如果跨多個時區的服務器不需要轉換)。
  • 應用程序將它們轉換為首選時區(這只發生一次,可能在最后一級)。
  • 不是字符串(與整數相比是巨大的)。
  • 減少數據庫計算( created東西<19345345345-24 * 60 * 60計算一次)。

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

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

假劣勢

  • 我相信Unix時間戳的有限范圍實際上並沒有限制。 時間戳是數據庫中的整數,因此您可以調整大小。 默認情況下, unsigned整數是int(10)這意味着您可以存儲最多4294967295數字,但它的限制不固定,因此我們可以輕松地將 int(10) int更改為 int(16) bigint

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

略微丟失細節。 MySQL Datetime變量可以非常精確。

此外,如果您必須比較數據庫中的日期,則日期格式具有一些您無法使用的內置函數。

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

select * from table1 where dateColumn = getDate() - 30

如果可以,請使用日期時間!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM