在MySQL日期字段中存储不完整的日期

Oma*_*ohl 21 mysql date

我想为用户提供引入不完整日期的可能性(例如2005年或1998年1月),还要提供年,月,日的完整日期.我可以使用DB中的单个日期字段来完成此操作吗?

我试过UPDATE tableA SET mydate = '2001-00-00',它似乎工作(没有错误),但我不确定这是否正确.在内部我假设使用时间戳,那么MySQL如何代表那些0?

Mik*_*ike 24

关于MySQL 的DATE_FORMAT()文档中有一个小注释,允许不完整的日期:

由于MySQL允许存储不完整的日期(例如'2014-00-00'),因此月份和日期说明符的范围从零开始.

正如指出的@ wonk0,MySQL将设置无效日期0000-00-00 00:00:00ALLOW_INVALID_DATES未设置.但是,即使ALLOW_INVALID_DATES没有设置,插入有效年份,月份和日期设置为零也不会触发此行为 - 至少在我的测试中没有(MySQL 5.1.54-1ubuntu4).我以前使用过这个功能没有任何问题,但到目前为止我还没有找到任何更详细的文档来完整地描述这种行为.

日期/时间比较也出现预期的工作:例如,2011-01-00 > 2011-00-00并且2011-00-01 > 2011-00-00也如你所愿.

UPDATE

看到这个答案(由另一个迈克)给一个类似的问题.它指向MySQL 5权威指南的摘录:

在旧版本的MySQL中,DATE和DATETIME数据类型只进行了有限数量的类型检查.通常允许0到12之间的数月,以及0和31天.但是,客户端程序负责提供正确的数据.(例如,0是一个月或一天的允许值,以便提供存储不完整或未知数据的可能性.)

从MySQL 5.0.2开始,有一个更彻底的验证,因此只能存储有效数据.仍然允许月和日值0,以及date 0000-00-00.