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

时间:2011-07-30 11:21:27

标签: mysql date

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

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

3 个答案:

答案 0 :(得分:24)

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

  

由于月份和日期说明符的范围从零开始   事实上,MySQL允许存储不完整的日期,如   '2014-00-00'。

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

日期/时间比较似乎也按预期工作:例如,2011-01-00 > 2011-00-002011-00-01 > 2011-00-00按预期执行。

<强>更新

请参阅this answer(由另一位迈克)提出的类似问题。它指向 MySQL 5的权威指南

的摘录
  

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

     

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

答案 1 :(得分:2)

好吧,如果您使用了日期字段,那么您应该期望那些0。你摆脱它们的一种方法是使用varchar选择。但是,最好使用日期字段,因为那里存储了什么。

如果您必须允许用户输入不完整的日期,那么它必须是varchar,在这种情况下,您可以使用脚本格式化输入并存储在该列中

答案 2 :(得分:1)