如何在MySQL数据库中最好地存储年,月和日,以便按年,按月,按年 - 月 - 日组合轻松检索?
答案 0 :(得分:4)
假设您有一个表tbl
,其中d
列DATE
。
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