首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL在喜欢的日期之间

MySQL在喜欢的日期之间
EN

Stack Overflow用户
提问于 2015-12-09 20:04:52
回答 4查看 4.3K关注 0票数 0

以下工作:

SELECT * FROM myTable WHERE date_created BETWEEN '2014-10-05' AND '2015-12-31';

然而,我尝试了以下几点:

SELECT * FROM myTable WHERE date_created BETWEEN '2014-10%' AND '2015-12%';

这是行不通的,有没有办法选择两个日期与通配符在其中?

SELECT * FROM myTable WHERE year(date_created) BETWEEN 2014 AND 2015 AND month(date_created) BETWEEN 10 AND 12

我也尝试过像上面这样做,这也不选择一个范围,它只选择所有的东西是20142015,所有只有月份1012的东西。

有什么办法可以让我做以下工作吗?

SELECT * FROM myTable WHERE date_created BETWEEN '2014-10%' AND '2015-12%';

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-12-09 20:28:55

使用LAST_DAY函数获取日期的最后一天。

代码语言:javascript
复制
WHERE date_created BETWEEN DATE_FORMAT('2014-10-05', '%Y-%m-01') AND LAST_DAY('2015-12-02')

这比在DATE_FORMAT列上使用date_created的解决方案要好,因为它可以在该列上使用索引。

票数 1
EN

Stack Overflow用户

发布于 2015-12-09 20:12:02

您可以为此使用DATE_FORMAT

代码语言:javascript
复制
SELECT * FROM myTable WHERE DATE_FORMAT(date_created,"%Y-%m") BETWEEN 
DATE_FORMAT('2014-10-05',"%Y-%m") AND DATE_FORMAT('2015-12-31',"%Y-%m") ;
票数 1
EN

Stack Overflow用户

发布于 2015-12-09 20:40:23

虽然@GoudaElalfy解决方案可以完成这项工作,但该查询可能会出现性能问题。它不会在列date_created上使用简单的索引。

引用您的评论,说明您实际上需要的是构建一个覆盖了整整几个月的查询:

我希望我能在SQL中得到一个月的范围,所以我不必在java中找到这个月的最后一天。因为这样做:在“2014-10-01”和“2015-12-31”之间,我需要知道上个月的nr。

您可以计算这些值,并将列保留在WHERE子句中,这样它就可以从简单的索引中获益。

  1. 您知道每个月都有第一天,这将是扫描索引/表的起点。
  2. 您需要计算一个月的最后一天,因为它不是静态的,这将是表/索引扫描过程中的结束点。

其中一种方法是使用LAST_DAY()函数

代码语言:javascript
复制
SELECT * 
FROM myTable 
WHERE date_created BETWEEN DATE_FORMAT('2014-10-05', '%Y-%m-01') AND LAST_DAY('2015-12-31');

第二种方法是使用一些简单的计算。

代码语言:javascript
复制
SELECT * 
FROM myTable 
WHERE date_created BETWEEN DATE_FORMAT('2014-10-05', '%Y-%m-01') AND DATE_FORMAT('2015-12-31' + INTERVAL 1 MONTH, '%Y-%m-01') - INTERVAL 1 DAY;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34187989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档