我通常在MySQL數據庫中使用PHP的time()
函數將日期存儲爲整數,而不是使用MySQL的日期格式,僅僅是因爲當我將它拉出時更容易操作,但是這樣做有什麼缺點嗎?MySQL日期或PHP時間?
回答
範圍:
總是有明顯的缺點:您可以存儲的範圍是有限的起價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的時間戳不能存儲時間段數據。我住在瑞典有一個時區,所以這對我來說不是問題。但是,如果你生活在一個跨越多個時區的國家,這可能是一大痛苦。
我曾經這樣做過,但現在我將它作爲MySQL DateTime存儲 - 僅僅因爲這意味着當查看數據庫中的原始數據時,我可以輕鬆解釋它。
除此之外,使用其他語言的數據可能更容易處理,而其他語言不會像UNIX那樣嚴重使用UNIX時間戳,但這兩種方法都沒有太大的牽引力。
一個缺點是,您將無法使用SQL函數操作和查詢 這些日期。
這不是太糟糕,但你會失去一些內置的功能,如:
SELECT * FROM表1,其中dateColumn = GETDATE() - 30
使用日期時間,如果你能!
只有幾個我能想到的:
*如果另一個非php應用程序需要使用數據庫,這將是一個難以閱讀的格式。
*如果你想在這些日期做任何基於SQL的工作(例如添加一個月或者獲取特定年份的所有值等),這將更加困難。
幾乎所有常見的語言都內置了劃時代的時間支持。 – 2009-06-10 20:37:23
細節的輕微損失。 MySQL Datetime變量可以非常精確。另外,如果你將不得不在數據庫中比較日期,日期格式有一些你不能使用的內置函數。
我希望看到您的聲明DATETIME更準確的參考。 – 2009-06-10 20:40:33
你的意思是更精確的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
對於您能夠存儲的日期範圍,UNIX時間戳具有明顯的限制。
我現在也總是使用DATETIME
字段。你可以使用SQL做很多DATE數學運算,所以你可以在現在和存儲日期之間提取有用的信息,例如DATEDIFF
,根本不需要任何PHP。
有許多缺點:
- 的精度缺乏; Unix時間僅精確到秒,並且僅適用於使用典型32位整數的1901-12-13和2038-01-19之間的日期
- 您不能使用任何內置數據庫函數來查詢或操縱
- 不能存儲時區
數據如果需要time_t
,它很容易轉換爲一個代碼。
您可以在表定義中爲MySQL的時間戳定義一個自動更新子句。
http://dev.mysql.com/doc/refman/5.0/en/timestamp.html
我認爲出於可擴展性原因,最好使用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
- 1. PHP MySQL的日期時間
- 2. PHP日期時間和mysql
- 3. PHP MYSQL日期,時間,日期時間和時間戳
- 4. mysql時間戳或日期時間
- 5. PHP日期時間和MySQL日期時間
- 6. INSERT當前日期或時間到MySQL
- 7. PHP日期時間插入到mysql
- 8. MySQL/PHP多個日期和時間
- 9. Mysql/Php - 當前日期和時間
- 10. MySQL -PHP插入日期時間
- 11. MYSQL日期時間 - PHP轉換
- 12. PHP/MySQL:日期時間計算?
- 13. 轉換日期時間在MySQL和PHP
- 14. PHP和MySQL:日期+時間存儲
- 15. Mysql時間戳和php日期()
- 16. MySQL的日期時間到PHP
- 17. php日期和mysql時間戳比較
- 18. php mysql日期/時間問題
- 19. PHP/MySQL的日期/時間差
- 20. PHP/mySQL日期/時間計算(OTRS)
- 21. 日期時間格式PHP和MySQL
- 22. PHP的preg_replace MySQL的日期時間或時間或日期JSON字符串向timestamp
- 23. PHP日期時間
- 24. PHP MySQL之間的日期
- 25. 用php插入或更新mysql日期時間字段
- 26. 根據日期或時間的日期或時間更改CSS
- 27. 時間戳,日期,時間或日期時間是哪個?
- 28. laravel日期時間日期從MySQL
- 29. mysql日期和日期時間問題
- 30. php mysql日期數組發佈日期時間
我只想說「+1」提到UNIX_TIMESTAMP和FROM_UNIXTIME函數......實質上給你兩全其美。 – Narcissus 2009-06-11 11:07:39