2010-10-17 431 views
2

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

+0

这是一个模糊的和主观的问题,但请阅读这篇文章:HTTP://www.richardlord。net/blog/dates-in-php-and-mysql它会引导你朝着正确的方向发展! – Trufa 2010-10-17 02:16:41

回答

3

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

2

我推荐这个很明显的:使用DATE

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

2

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

1

DATE有什么问题?只要您需要Y,Y-M或Y-M-D搜索,它们应该是可索引的。例如,DATE的问题在于,如果您希望跨越数年的所有12月份记录。

4

比方说,你有一个表tblDATE类型的列d

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

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年:

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

在三月份的所有记录1997年的

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

我是MySQL专家最远的东西,但我注意到MySQL文档建议在查询时明确地将字符串文字转换为日期(_WHERE d BETWEEN CAST('1997-03-01'AS DATE)AND CAST( '1997年3月31日')_)。我认为,否则,日期列值将转换为字符串以允许通配符比较,从而无法在列上使用索引。 – 2010-10-17 12:52:20

+0

拉里,我从来没有听说过,但它很有意义。谢谢! – benzado 2010-10-18 06:08:48

0

这可能与档案工作者使用共同日期数据类型的问题。通常情况下,您希望只能编码年份,或只是年份和月份,具体取决于可用的信息,但您希望能够将这些信息编码为一种数据类型。这是一个不适用于很多其他情况的问题。 (在回答过去的这个问题时,我曾经让技术人员将其视为数据问题:数据有问题!)

例如,在作曲家目录中,您记录了作曲家过时的事实手稿“1951年1月”。你可以在MySQL DATE字段中放置什么来表示它? “1951至1901年”? “1951-01-00”?两者都不是真的有效。通常情况下,您最终会在单独的字段中编码几年,几个月和几天,然后必须在应用程序级别实现语义。这远非理想。

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 
相关问题