2011-07-30 44 views
20

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

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

+0

当你查询'SELECT mydate FROM tableA'时你会得到什么? – phlogratos

+0

正确的值,即2001-00-00。我担心的是我正在利用一些没有任何标准的行为,这些行为依赖于某些可能在某些情况下会休息或不工作的诡计。 –

回答

22

有一个小纸条在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-002011-00-01 > 2011-00-00按照您的预期进行。

UPDATE

this answer(由另一个麦克),以类似的问题。它指出,从权威指南到MySQL 5的摘录:

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

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

+1

是否使用时间戳记来存储日期不正确?因为我没有看到你如何表示2011-00-00作为时间戳。 –

+1

@Omar Kohl:是的,我认为这种假设是不正确的。 'TIMESTAMP'的范围小于'DATETIME'。 'DATETIME'使用8个字节,而'TIMESTAMP'使用4个字节。请参阅[数据类型存储要求](http://dev.mysql.com/doc/refman/5.5/en/storage-requirements.html#id918335) – Mike

+1

优秀的答案,我发现搜索的最好和最广泛的。 –

2

那么,如果你使用日期字段,那么你应该期待这些0。您可以通过使用varchar选择来摆脱它们。但是,最好使用日期字段,因为那里存储了什么。

如果必须让用户输入一个不完整的日期,那么它必须是一个varchar并且在这种情况下,你可以在该列日期

+0

这将是我最后的手段。当然,有日期格式的东西总是比较好订购等。 –

+1

是的,所以,而不是让用户格式化日期,我建议你只是让sql格式化当前'datetimestamp'那里 – DaMainBoss

+0

+1非常好的一点。 Dats我会做的事 – 2011-07-30 12:14:43

1

存储部分取决于格式与你的脚本和存储输入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中的无效日期。

+1

“ALLOW_INVALID_DATES:不要执行完整的日期检查,只检查月份是在1到12的范围内,而日期是在1到31的范围内。” 在这种情况下,它不适用,因为月份和日期都不在该范围内......(00 both) –

+0

'只检查月份是否在1到12的范围内,并且日期范围是1到31'为什么这允许一个月或一天0? – phlogratos

相关问题