2015-09-27 96 views
1

按日期和/或月份和/或年份选择记录的最有效方法是什么?按日期和/或月份和/或年份检索记录的最有效方法是什么?

INT(2) day 
INT(2) month 
INT(4) year 

SELECT * FROM table WHERE table.year=2015 
SELECT * FROM table WHERE table.month=9 AND table.year=2015 
SELECT * FROM table WHERE table.day=26 AND table.month=9 AND table.year=2015 

DATE date 

SELECT * FROM table WHERE YEAR(table.date)=2015 
SELECT * FROM table WHERE MONTH(table.date)=9 AND YEAR(table.date)=2015 
SELECT * FROM table WHERE table.date="2015-09-26" 

注:也有可能是在一天不管搜索的年份和月份的 ,或每月为搜索不分白天和今年的情况。

+1

不要忘记upvote,downvote,如果合适的话接受答案。甚至反馈,如“这是垃圾,没有任何意义”。我们使用这些反馈,并鼓励我们帮助下一个人,不管它是什么。 – Drew

回答

1

第一个人可能会根据索引或复合材料(注意复数)拖动。试图变得聪明是很有可能的,它比较慢。复合宽度并非比日期数据类型大小更精确,它使用@ 3个字节进行烘焙。

除非您的查询“给我每月的第一天,无论年份和月份的”

所以,我用#2的性能。您不仅需要对上述查询进行性能评估,而且还要评估整体性能(认为过多的组合需求及其宽度,即使相对较小)也会影响插入/更新。尽管如此,即使只关注您的查询,3个字节也小于8(或大多数人可能会使用的12个字节)。请注意,我们正在说Date,而不是Datetime

此外,您还可以获得日期函数的所有优点,而无需编写自己的函数。

1

更有效的方法是第一种方法。 但是你应该使用本地日期格式,这样就排除了第一种方法。

所以,最好的方法是:

select * from table where table.date >= '2015-01-01' and table.date < '2016-01-01'; 
select * from table where table.date >= '2015-09-01' and table.date < '2015-10-01'; 
select * from table where table.date >= '2015-09-26' and table.date < '2016-09-27'; 

最后一个条件可能是能够使用=,如果日期没有时间组件。

相关问题