我想为用户提供引入不完整日期的可能性(例如,仅2005年或1998年1月),还要提供包含年,月,日的完整日期。我可以使用DB中的单个日期字段来完成此操作吗?
我已经尝试UPDATE tableA SET mydate = '2001-00-00'
它似乎有用(没有错误),但我不确定这是否正确。在内部我假设使用时间戳,那么MySQL如何代表那些0?
答案 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-00
和2011-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)
存储部分日期取决于MySQL运行的sql模式。请阅读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中的无效日期。