Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql优化查询where date hour_Mysql_Date_Where_Hour - Fatal编程技术网

mysql优化查询where date hour

mysql优化查询where date hour,mysql,date,where,hour,Mysql,Date,Where,Hour,大家好,我有一个非常完整的查询,需要优化 我需要选择创建日期现在匹配的所有记录-35天,但分钟和秒可以是任意的 我这里有一个问题,很难看,但很有效: 欢迎提供任何优化建议 SELECT * FROM outbound_email oe INNER JOIN (SELECT `issue_id` FROM `issues` WHERE 1 ORDER BY year DESC, NUM DESC LIMIT 0,5) as iss

大家好,我有一个非常完整的查询,需要优化

我需要选择创建日期现在匹配的所有记录-35天,但分钟和秒可以是任意的

我这里有一个问题,很难看,但很有效:

欢迎提供任何优化建议

SELECT * FROM outbound_email
                 oe
                INNER JOIN (SELECT  `issue_id` FROM `issues` WHERE 1 ORDER BY year DESC, NUM DESC LIMIT 0,5) as issues  
                ON oe.issue_id = issues.issue_id
                WHERE 
                    year(created) = year(  DATE_SUB(NOW(), INTERVAL 35 DAY) ) AND
                    month(created) = month(  DATE_SUB(NOW(), INTERVAL 35 DAY) ) AND
                    day(created) = day(  DATE_SUB(NOW(), INTERVAL 35 DAY) ) AND
                    hour(created) = hour(  DATE_SUB(NOW(), INTERVAL 35 DAY) )  
                    AND campaign_id IN (SELECT id FROM campaigns WHERE initial = 1)
我假设字段“created”是一个datetime字段,并且来自issues表?由于您不需要问题和活动表上的任何其他内容,因此可以执行以下操作:

SELECT e.* FROM outbound_email e
JOIN issues i ON e.issue_id = i.issue_id
JOIN campaigns c ON c.id = i.campaign_id
WHERE i.created < DATE_SUB(NOW(), INTERVAL 35 DAY)
AND c.initial = 1
从出站电子邮件e中选择e.*
在e.issue\u id=i.issue\u id上加入问题i
在c.id=i.campaign\u id上加入活动c
其中i.created

没有必要将datetime字段分为年、月……等等。

您似乎在说要从表中选择所有行,这些行的创建时间与当前35天前的时间相同

SELECT * FROM table WHERE created BETWEEN
  DATE_ADD(CURDATE(), INTERVAL (HOUR(now()) - 840) HOUR) AND
  DATE_ADD(CURDATE(), INTERVAL (HOUR(now()) - 839) HOUR)
它为什么有效?Curdate告诉我们今天是午夜。我们加上当前时间的小时数(例如,假设现在是下午5点,我们加上'hour(now()),我们得到17,现在是下午5点),但我们也减去840,因为这是35天*每天24小时=840小时。因此,Date add将比当前日期(即35天前的下午5点)增加-823小时

SELECT * FROM table WHERE created BETWEEN
  DATE_ADD(CURDATE(), INTERVAL (HOUR(now()) - 840) HOUR) AND
  DATE_ADD(CURDATE(), INTERVAL (HOUR(now()) - 839) HOUR)
我们将搜索范围设为从小时中获取所有记录的范围,指定一小时后的最简单方法是减去839小时,而不是840小时

从技术上讲,此查询还将返回35天前下午6点(但不是一秒钟之后)的记录,因为between是包含的(介于1和10之间也将返回10)

如果这是一个问题,请更改
created>=blah和created

为了清楚起见,我没有把你剩下的问题放进去


顺便说一句,你的做法还不错——你可以通过不使用年/月/日部分来简化事情,只需使用
date(created)=date_sub(curdate(),interval 35 day)删除日期的时间部分
年、月、日组合为日期,而不是时间元素。但通常最好不要设置表数据的格式,也不要将其转换为与查询匹配的格式。如果转换表数据,则索引将无法再使用。如果您付出额外的努力将查询参数转换为列的格式,则不要转换表数据,然后可以使用列上的索引

许多人在优化查询方面寻求帮助。您可以先查看一些问题,这些问题是向上投票并回答的,还有向下投票并关闭的。前者的共同特点是模式定义、解释计划、计时和或部分和完整select语句。