我想爲用戶提供引入不完整日期(例如僅在2005年或1998年1月)的可能性,還要提供年,月,日的完整日期。我可以在數據庫中使用單個日期字段來完成此操作嗎?在MySQL日期字段中存儲未完成日期
我試過UPDATE tableA SET mydate = '2001-00-00'
它似乎工作(沒有錯誤),但我不確定這是否正確。在內部,我假定使用時間戳,那麼MySQL如何表示那些0?
我想爲用戶提供引入不完整日期(例如僅在2005年或1998年1月)的可能性,還要提供年,月,日的完整日期。我可以在數據庫中使用單個日期字段來完成此操作嗎?在MySQL日期字段中存儲未完成日期
我試過UPDATE tableA SET mydate = '2001-00-00'
它似乎工作(沒有錯誤),但我不確定這是否正確。在內部,我假定使用時間戳,那麼MySQL如何表示那些0?
有一個小紙條在documentation for the DATE_FORMAT()關於MySQL允許不完整的日期:
範圍爲月份和日期符零開始,由於 事實是,MySQL允許不完整的日期,如 「的存儲2014-00-00' 。
正如@wonk0指出,MySQL將在ALLOW_INVALID_DATES
未設置集無效日期0000-00-00 00:00:00
。但是,即使沒有設置ALLOW_INVALID_DATES
,插入一個月份和日期設置爲零的有效年份也不會觸發此行爲 - 至少不會在我的測試中(MySQL 5.1.54-1ubuntu4)。我以前使用過這個功能沒有任何問題,但是到目前爲止我還找不到更詳細的描述這種行爲的詳細文檔。
日期/時間比較也按預期工作:例如,2011-01-00 > 2011-00-00
和2011-00-01 > 2011-00-00
按照您的預期進行。
UPDATE
見this answer(由另一個麥克),以類似的問題。它指出,從權威指南到MySQL 5的摘錄:
在舊版本的MySQL,日期和時間數據類型只做 類型檢查的數量有限。對於 個月的0和12之間的值以及對於天的0和31通常是允許的。但是,客戶端程序的責任是提供正確的數據。 (對於 例如,0是一個月或一天 容許值,以便提供存儲不完整的或未知的數據的可能性。)
與MySQL 5.0.2開始,有一個更徹底驗證,所以 只能存儲有效的數據。仍然允許的是月和 日的值爲0,以及日期爲0000-00-00。
是否使用時間戳記來存儲日期不正確?因爲我沒有看到你如何表示2011-00-00作爲時間戳。 –
@Omar Kohl:是的,我認爲這種假設是不正確的。 'TIMESTAMP'的範圍小於'DATETIME'。 'DATETIME'使用8個字節,而'TIMESTAMP'使用4個字節。請參閱[數據類型存儲要求](http://dev.mysql.com/doc/refman/5.5/en/storage-requirements.html#id918335) – Mike
優秀的答案,我發現搜索的最好和最廣泛的。 –
那麼,如果你使用日期字段,那麼你應該期待這些0。您可以通過使用varchar
選擇來擺脫它們。但是,最好使用日期字段,因爲那裏存儲了什麼。
如果必須讓用戶輸入一個不完整的日期,那麼它必須是一個varchar
並且在這種情況下,你可以在該列日期
這將是我最後的手段。當然,有日期格式的東西總是比較好訂購等。 –
是的,所以,而不是讓用戶格式化日期,我建議你只是讓sql格式化當前'datetimestamp'那裏 – DaMainBoss
+1非常好的一點。 Dats我會做的事 – 2011-07-30 12:14:43
存儲部分取決於格式與你的腳本和存儲輸入sql模式MySQL正在運行。請閱讀http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html,尤其是http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html#sqlmode_allow_invalid_dates中的無效日期。
「ALLOW_INVALID_DATES:不要執行完整的日期檢查,只檢查月份是在1到12的範圍內,而日期是在1到31的範圍內。」 在這種情況下,它不適用,因爲月份和日期都不在該範圍內......(00 both) –
'只檢查月份是否在1到12的範圍內,並且日期範圍是1到31'爲什麼這允許一個月或一天0? – phlogratos
當你查詢'SELECT mydate FROM tableA'時你會得到什麼? – phlogratos
正確的值,即2001-00-00。我擔心的是我正在利用一些沒有任何標準的行爲,這些行爲依賴於某些可能在某些情況下會休息或不工作的詭計。 –