如何在MySQL数据库中最好地存储年,月和日?

时间:2010-10-17 02:13:28

标签: sql mysql

如何在MySQL数据库中最好地存储年,月和日,以便按年,按月,按年 - 月 - 日组合轻松检索?

7 个答案:

答案 0 :(得分:4)

假设您有一个表tbl,其中dDATE

1997年的所有记录:

SELECT * FROM tbl WHERE YEAR(d) = 1997
SELECT * FROM tbl WHERE d BETWEEN '1997-01-01' AND '1997-12-31'

1997年3月的所有记录:

SELECT * FROM tbl WHERE YEAR(d) = 1997 AND MONTH(d) = 3
SELECT * FROM tbl WHERE d BETWEEN '1997-03-01' AND '1997-03-31'

1997年3月10日的所有记录:

SELECT * FROM tbl WHERE d = '1997-03-10'

答案 1 :(得分:3)

除非涉及时间,否则请使用DATE数据类型。您可以使用此处的功能选择日期的部分内容。

答案 2 :(得分:2)

我建议使用DATE

它存储年 - 月 - 日,没有时间(小时 - 分 - 秒等)组件。

答案 3 :(得分:2)

存储为日期并使用内置函数:day(),month()或year()返回您希望的组合。

答案 4 :(得分:1)

DATE有什么问题?只要您需要Y,Y-M或Y-M-D搜索,它们就应该是可索引的。例如,DATE的问题在于你是否想要所有12月份的记录。

答案 5 :(得分:0)

这可能与档案管理员具有常见日期数据类型的问题有关。通常,您希望能够仅编码年份,或仅编码年份和月份,具体取决于可用的信息,但您希望能够仅以一种数据类型对此信息进行编码。这是一个在许多其他情况下不适用的问题。 (在过去回答这个问题时,我有技术类型将其视为数据问题:您的数据有问题!)

例如,在作曲家目录中,你正在记录这位作曲家与手稿“1951年1月”约会的事实。您可以在MySQL DATE字段中添加什么来表示这一点? “1951至1901年”? “1951-01-00”?两者都不是真的有效。通常,您最终会在单独的字段中编码年,月和日,然后必须在应用程序级别实现语义。这远非理想。

答案 6 :(得分:0)

如果您针对固定的日期范围进行分析,请考虑使用日期维度(表格的花式名称)并在日期维度中使用外键。看看这个链接:

http://www.ipcdesigns.com/dim_date/

如果您使用此日期维度,请考虑根据您可以想到的任何日期构建查询的容易程度。

SELECT * FROM my_table
JOIN DATE_DIM date on date.PK = my_table.date_FK
WHERE date.day = 30 AND
      date.month = 1 AND
      date.year = 2010

或者

SELECT * FROM my_table
JOIN DATE_DIM date on date.PK = my_table.date_FK
WHERE date.day_of_week = 1 AND
      date.month = 1 AND
      date.year = 2010

或者

SELECT *, date.day_of_week_name FROM my_table
JOIN DATE_DIM date on date.PK = my_table.date_FK
WHERE date.is_US_civil_holiday = 1