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

回到顶部