如何在MySQL中使用BETWEEN功能来搜索 任何 年份中的日期,但是在特定日期/月份到特定日期/月份之间?或者,如果不能使用BETWEEN,我还能怎样完成它?
为了更具描述性,我正在尝试将季节性搜索添加到我的照片存档网站。因此,如果用户选择搜索“夏季”照片,它将搜索6月21日至9月21日期间拍摄的照片,但是从任何一年开始。
如果嘉士伯制作SQL,我认为它会是:)
WHERE date BETWEEN 'xxxx-06-21' AND 'xxxx-09-21'
非常感谢
答案 0 :(得分:4)
其他地方给出的解决方案WHERE date.MONTH() || date.DAY() BETWEEN '0621' AND '0921'
是一个很好的解决方案(并且它值得提升,因为它适用于大多数MySQL数据库)但我想指出它(以及大多数涉及到的问题)行函数)不能很好地扩展到大表。
当然,我的经验是MySQL不会被用于那些会产生巨大差异的大小,但是,如果是,你还应该考虑以下内容。
我们过去使用的一个技巧是将额外的列与插入/更新触发器组合在一起,以便计算成本仅在必要时(数据发生更改时)发生,而不是在每一个选择。
由于绝大多数数据库的阅读频率远远高于书面数据,因此这会使所有选择的费用减少。
例如,添加一个名为CHAR(4)
的新列MMDD
并在其上敲打索引。然后在表格上设置插入/更新触发器,以便根据已提供的公式date
使用date.MONTH() || date.DAY()
列设置此新列。
然后,在进行查询时,跳过每行功能,改为使用:
WHERE MMDD BETWEEN '0621' AND '0921'
它被索引的事实将保持速度快速,以插入/更新期间触发器的少量成本和额外的列。
触发器的成本无关紧要,因为它低于每次选择操作的成本。列所需的额外存储空间是一个缺点,但是,如果您检查人们询问的有关数据库的所有问题,速度问题与存储问题的比率相当高: - )
而且,虽然这在技术上会“破坏”3NF,因为你复制了数据,但是出于性能原因,这是一个历史悠久的传统,如果你知道你正在做什么(即触发器减轻了“伤害”)。
答案 1 :(得分:3)
我认为简单的方法是获取日期,将它们转换为字符串,使用后缀,然后通过BETWEEN
运行:
WHERE date.MONTH() || date.DAY() BETWEEN '0621' AND '0921'
答案 2 :(得分:2)
RIGHT
功能可能有帮助
select
current_date,
right(current_date,5),
right(current_date,5) between '06-21' and '09-21' `IsTodaySummer?`,
'09-21' between '06-21' and '09-21' `Is 09-21 Summer?`;
+--------------+-----------------------+-----------------+-------------------+
| current_date | right(current_date,5) | IsTodaySummer? | Is 09-21 Summer? |
+--------------+-----------------------+-----------------+-------------------+
| 2011-09-29 | 09-29 | 0 | 1 |
+--------------+-----------------------+-----------------+-------------------+
但正如ajeal所说,添加另一列更好地使用索引。
答案 3 :(得分:1)
如果你真的需要这种格式的搜索,
我想最好将日期列分成两部分,
year int(4) unsigned
(即年份)month_day int(4) unsigned
(mmdd)在month_day, year
上构建综合索引,
这个想法是让索引更好地运作
示例查询,如
where month_day between 621 and 921 -- make use on index
另一个例子
where year=2011 and month_day between 900 and 930 -- make use on index too
答案 4 :(得分:0)
MySQL中应该有一个等效的Oracle to_date()函数。
答案 5 :(得分:0)
where month(date_column) between 6 and 9
and if(month(date_column) = 6 and day(date_column) < 21, 0, 1)
and if(month(date_column) = 9 and day(date_column) > 21, 0, 1)
仅需要if
内容,因为您的边界与月份的排列不顺畅。
如果您要做很多这类事情,那么您可能最好预先计算完整日期的月日版本,以便您可以为其编制索引。
答案 6 :(得分:0)
由于您不需要年份,因此从日期中减去它。 在MySQL中,你可以这样做:
select * from some_table
where date_sub(date_col, interval year(date_col) year)
between '0000-06-21' and '0000-09-21';