Mysql 储存日期和月份(无年份)

Mysql 储存日期和月份(无年份),mysql,database-design,Mysql,Database Design,我很难找到在数据库中存储数据的最佳方法。我必须将DD/MM日期存储在数据库中,但我不确定最好的存储方式,以便可以轻松地对其进行排序和搜索 基本上,用户将能够以DD/MM格式保存重要日期,并在接近当天时提醒他们 日期数据类型似乎并不完全合适,因为它包括年份,但我想不出另一种存储此数据的方法。可以在所有场合的末尾加上一年,但这似乎不太正确。这些日期是否重复出现?如果没有,您将如何跟踪何时“过期”?如果答案是“一旦日期过期,应用程序将手动删除日期”,那么为什么不简单地将DD/MM日期存储为该日期的下一

我很难找到在数据库中存储数据的最佳方法。我必须将DD/MM日期存储在数据库中,但我不确定最好的存储方式,以便可以轻松地对其进行排序和搜索

基本上,用户将能够以DD/MM格式保存重要日期,并在接近当天时提醒他们


日期数据类型似乎并不完全合适,因为它包括年份,但我想不出另一种存储此数据的方法。可以在所有场合的末尾加上一年,但这似乎不太正确。

这些日期是否重复出现?如果没有,您将如何跟踪何时“过期”?如果答案是“一旦日期过期,应用程序将手动删除日期”,那么为什么不简单地将
DD/MM
日期存储为该日期的下一个可用实例?例如:

01/02
变为
2012-02-01
04\07
变为
2011-07-04


内置的日期/时间函数非常有用,因此我强烈建议您不要使用
varchars
tinyints

如果您真的想删除年份,那么只需创建两列,一列表示日期,另一列表示月份。然后分开存放

CREATE TABLE `table-name` (
  `Day` tinyint NOT NULL,
  `Month` tinyint NOT NULL
);
但是,最好只使用
日期
类型,然后忽略代码中的年份。

我必须将DD/MM日期存储在数据库中,但我不确定最好的存储方式,以便可以轻松地对其进行排序和搜索

存储日期数据的最佳方法是使用日期,即使不需要年份组件。当您需要使用它时,您可以删除年份,或者将其替换为与之比较的年份(或当前年份)

将其置于日期列有助于正确排序、完整性、验证等

为了适应闰年,请使用“0004”这样的年份,它允许使用“0004-02-29”。使用第4年会使它比第0年稍微复杂一些,但作为一个例子,这会将日期“2月29日”(年份不可知)变成今年的日期,以便与其他一些字段进行比较

select
    adddate(
    subdate(cast('0004-02-29' as date),
        interval 4 year),
        interval year(curdate()) year)

result: 2011-02-28

对不起,我无法想象你为什么要避开年份,当你不知道年份的时候,日期又有什么意义呢?但你可以使用字符串作为字段类型,并在iti中保存月份和日期。我会使用日期类型,即使不使用,也不会有损于现在的一年、更大的未来灵活性、优化的存储等等。@Senad我并不是想避开年份,只是我对它不感兴趣。例如,我不需要知道澳大利亚的第一个官方节日是在1818年。相反,我只是想把它存储在26/1。@SenadMeškin有很多情况下不需要年份,例如生日,我不想问我的顾客他们出生的年份,但我想知道送礼物的月份和日期。@Sasha,顺便说一句,MySQL也有一个类型。他将如何计算从一个日期到另一个日期的天数?他需要一张
Month
table。这将是一场灾难。@Closure牛仔,是的,这肯定会是一场灾难。这就是为什么我建议反对它。@ClosureCowboy,shamittomar,没有灾难。您也可以自己在PHP端或MySQL端(存储过程)进行日期计算。@ClosureCowboy只要在使用之前用您的语言创建一个日期对象就可以了。我很确定可以通过列连接创建一个日期/时间对象(例如:time(CONCAT(tabla.hours,,:',tabla.minutes,:00'))。可能不是最好的选择,但可能是可行的。这正是我所需要的。这里非常需要,因此我们CRM的注册客户可以以两种格式存储生日:dd/mm或dd/mm/yyyy。谢谢!今年不要使用
0004
,因为MySQL的
DATE
类型不存储
1000-01-01
之前的日期。请使用
1000
instead(或
1000-01-01
之后的任何闰年)。请参阅@MarceloPascual MySQL非常乐意使用“0004-02-29”作为可比较的日期或时间间隔,即使它超出了存储的有效范围。此外,使用0004的意义在于它是闰年。1000年不是。@RichardTheKiwi你是对的,1000不是闰年。我的错误。然后我建议使用1004。即使接受0004,如果docs说支持的范围是1000-01-01到9999-12-31,我会选择1004:)