我有类似于以下内容的查询:
-- 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'
或者我应该计算常量并使用代码构建查询。
根据 MySQL NOW()
函数的文档(CURRENT_TIMESTAMP
是同义词):
NOW()
返回一个常量时间,指示语句开始执行的时间。(在存储的函数或触发器中,NOW()
返回函数或触发语句开始执行的时间。这与SYSDATE()
的行为不同,后者返回执行的确切时间。
因此,查询优化器会根据需要将其视为常量。 可以在EXPLAIN
输出中看到这一点。
我不能代表MSSQL,尽管也许这个博客值得一读?
右侧有一个函数,而不是常量。每次都必须重新评估查询...
(我错过了一点吗??
编辑
就像@Martin和@eggyval善意地解释的那样,我确实错过了一点。这个问题显然不是关于编译时优化,所以我把这句可怜的、可怜的评论作为像我这样的混蛋应该会发生什么的纪念碑......