SQL - 日期之间(xxxx-06-21和xxxx-09-21)

时间:2011-09-29 02:14:58

标签: mysql sql search

如何在MySQL中使用BETWEEN功能来搜索 任何 年份中的日期,但是在特定日期/月份到特定日期/月份之间?或者,如果不能使用BETWEEN,我还能怎样完成它?

为了更具描述性,我正在尝试将季节性搜索添加到我的照片存档网站。因此,如果用户选择搜索“夏季”照片,它将搜索6月21日至9月21日期间拍摄的照片,但是从任何一年开始。

如果嘉士伯制作SQL,我认为它会是:)

WHERE date BETWEEN 'xxxx-06-21' AND 'xxxx-09-21'

非常感谢

7 个答案:

答案 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)

您可以使用monthday函数拉开日期:

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';