这是SQL的where
子句。当我删除这部分时,它需要3分钟来执行,这个需要超过15分钟
DB
WHERE username = 'xyz' AND
(
( acceptedfordeliverytime BETWEEN '2012-9-1' AND '2013-1-29' )
OR
(
YEAR(acceptedfordeliverytime) = YEAR('2013-1-29')
AND
MONTH(acceptedfordeliverytime) = MONTH('2013-1-29')
AND
DAY(acceptedfordeliverytime) = DAY('2013-1-29')
)
OR
(
YEAR(acceptedfordeliverytime) = YEAR('2012-9-1')
AND
MONTH(acceptedfordeliverytime) = MONTH('2012-9-1')
AND
DAY(acceptedfordeliverytime) = DAY('2012-9-1')
)
)
答案 0 :(得分:2)
为什么不使用:
WHERE username = 'xyz' AND
(acceptedfordeliverytime >= '2012-09-01' AND
acceptedfordeliverytime < '2013-01-30'
)
这也将允许在执行查询时使用(username, acceptedfordeliverytime)
上的索引。
答案 1 :(得分:0)
我认为这会给你相同的结果。 并且还可以为已接受列的列创建索引,以加快搜索速度。
WHERE username = 'xyz' AND acceptedfordeliverytime BETWEEN '2012-9-1' AND '2013-1-29'
答案 2 :(得分:0)
不包含BETWEEN吗?这意味着您不需要所有额外的条款(以非常精细的方式检查第一个和最后一个日期)。我相信你的查询会返回相同的结果:
WHERE username = 'xyz' AND
(
acceptedfordeliverytime BETWEEN '2012-9-1' AND '2013-1-29'
)
答案 3 :(得分:0)
你的两个OR部分都是不必要的。
使用时
acceptedfordeliverytime Between '2012-9-1' AND '2013-1-29'
它使用了两个日期,因此不需要部分。如果您的数据库中有日期和时间,那么您可以将其转换为日期,如此
CAST(acceptedfordeliverytime as date) Between '2012-9-1' AND '2013-1-29'