mysql优化查询在哪里日期小时
大家好,我有非常awfull查询,需要优化。mysql优化" title="mysql优化">mysql优化查询在哪里日期小时
我需要选择所有创建日期与现在匹配的记录 - 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)
回答:
我认为“创造”的字段是一个日期时间字段,是从问题表?既然你不需要任何的问题和竞选表一样,那么你就可以做到以下几点:
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
没有必要到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,现在是5pm的时间),但是我们也减去840,因为那是35天*每天24小时= 840小时。因此,添加日期因此将在当前日期,即35天前下午5点加上-823小时
我们使搜索范围从小时获得所有记录,指定一小时后的最简单方法是减去839小时而不是840
技术上此查询也将返回都在下午6点砰记录(但不晚一秒钟)35天前也因为是(含)之间(1和10之间将返回10还
如果这是一个问题,改变BETWEEN为created >= blah AND created < blahblah
我还没有把你的查询的其余部分出于清晰的原因
作为一个便笺,您做这件事的方式并不差 - 您可以通过没有年/月/日部分来简化事情,只需将日期的一部分与date(created) = date_sub(curdate(), interval 35 day)
这是年份和月份,日期合并为一个日期,没有时间元素..但通常总是最好将表格数据单独保存,而不是格式化或将其转换为仅匹配查询。如果您转换表格数据,则不能再使用索引。如果您多花一分钟将查询参数转换为列的格式,并且不转换表格数据,则可以使用列上的索引
以上是 mysql优化查询在哪里日期小时 的全部内容, 来源链接: utcz.com/qa/258780.html