2009-01-06 60 views
1

存储日期值的最佳方式是什么?在很多情况下,只有一年可能知道日期值?在只有一年可能知道的日期存储日期

除非启用了NO_ZEROES_IN_DATE sql模式,MySQL默认情况下不允许使用日期部分中的零。如果月份和日期可能为零,或者将年份,月份和日期(年份(4),tinyint,tinyint)分成3个不同的字段,是否有任何理由不使用日期字段?

+0

有时候你知道日期的其余部分吗?或者你只使用它来保存多年? – 2009-01-06 15:46:17

+0

是的,推测可能在某些情况下使用月份和日期 – 2009-01-06 16:20:02

回答

0

您可以在Mysql中使用单个日期字段来执行此操作。在下面的例子中,字段具有日期数据类型。

mysql> select * from test; 
+------------+------+ 
| field  | id | 
+------------+------+ 
| 2007-00-00 | 1 | 
+------------+------+ 
1 row in set (0.00 sec) 

mysql> select * from test where YEAR(field) = 2007; 
+------------+------+ 
| field  | id | 
+------------+------+ 
| 2007-00-00 | 1 | 
+------------+------+ 

我会使用一个字段,它会使查询更容易。

是的,使用Date and Time functions会更好。 谢谢BrynJ

2

更好的办法是将日期分成3个字段。年月日。这为您提供了存储,排序和搜索的完全灵活性。

此外,在必要时将字段放回到实际日期字段中非常简单。

最后,它跨DBMS可移植。我不认为其他人支持0作为日期值的有效部分。

2

除非跨DBMS的可移植性很重要,否则我肯定会倾向于使用单个日期字段。如果您甚至需要适度复杂的与日期相关的查询,那么将日,月和年的值放在单独的字段中将成为一件杂事。

MySQL有丰富的日期相关函数 - http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html。如果您只想返回年份值,请使用YEAR(yourdatefield);如果您想将其包含在查询的WHERE子句中,请使用YEAR(yourdatefield)。

0

你可以尝试一个LIKE操作。如: SELECT * FROM table WHERE date_feield LIKE 2009;

0

这取决于你如何使用结果数据。一个简单的答案就是简单地存储那些只有年份被称为1月1日的日期。这种方法非常简单,并且允许您按年使用所有标准的日期函数进行汇总。

如果月份或日期显着,则会出现问题。例如,如果您试图在几天,几周,几个月内确定记录的年龄,或者您想要在较小的粒度级别上显示分布。不过,这个问题存在。如果你有一些完整的日期,有些只有一年,你想在这种情况下代表他们。