1

我有类似的查询:

-- MySQL Query
SELECT * FROM table1 WHERE start_date >= CURRENT_TIMESTAMP - INTERVAL 7 DAY

-- MSSQL Query
SELECT * FROM table1 WHERE start_date >= GETDATE() - 7

由于右侧的表达式不依赖于列值,我是否应该期望查询优化器将其优化为一个常量值,例如:

SELECT * FROM table1 WHERE start_date >= '2012-04-28 14:54:31'

或者我应该计算常量并使用代码构建查询。

4

2 回答 2

2

根据 MySQLNOW()函数的文档(这CURRENT_TIMESTAMP是同义词):

NOW()返回一个常数时间,指示语句开始执行的时间。(在存储的函数或触发器中,NOW()返回函数或触发语句开始执行的时间。)这与 for 的行为不同SYSDATE(),后者返回其执行的确切时间。

因此,查询优化器将根据需要将其视为常量。可以在输出中看到这一点。EXPLAIN

我不能为 MSSQL 说话,虽然也许这个博客值得一读?

于 2012-05-05T10:23:37.023 回答
-1

你在右边有一个函数,而不是一个常数。每次都必须重新评估查询...

(我错过了一点吗??)

编辑

就像@Martin 和@eggyval 好心解释的那样,我确实错过了一点。这个问题很明显不是关于编译时优化的,所以我把这个可怜的、可怜的评论作为纪念碑来纪念像我这样的混蛋应该发生什么……

于 2012-05-05T10:15:55.830 回答