我在使用 MySQL 选择查询时遇到了一些意外行为。我正在运行查询:
SELECT `refno`, `subdomain`, `toplevels`, `renew_until`, `expiry_date`,
(YEAR(`renew_until`) - YEAR(`expiry_date`)) AS `renew_for` FROM `testing_names`
WHERE `expiry_date` >= DATE(NOW()) AND `renew_for` >= 0
返回(如预期):
| refno | subdomain | toplevels | renew_until | expiry_date | renew_for |
|-----------------------------------------------------------------------------------|
| 5 | domain1 | com | 2014-02-02 | 2014-02-02 | 0 |
| 45 | domain2 | net | 2014-01-27 | 2013-01-27 | 1 |
但是下面的查询(注意 renew_for
的不同比较)返回一个空集:
SELECT `refno`, `subdomain`, `toplevels`, `renew_until`, `expiry_date`,
(YEAR(`renew_until`) - YEAR(`expiry_date`)) AS `renew_for` FROM `testing_names`
WHERE `expiry_date` >= DATE(NOW()) AND `renew_for` > 0
在这种情况下,我期待第 45 行;我的查询有什么问题?我是否以正确的方式使用 renew_for
?
最佳答案
其他 RDBMS 不允许此语法:列别名不应在 WHERE 子句中可用。
MySQL does it's own thing though结果不稳定:
Standard SQL doesn't allow you to refer to a column alias in a WHERE clause. This restriction is imposed because when the WHERE code is executed, the column value may not yet be determined.
所以,把WHERE条件改成这样
WHERE `expiry_date` >= DATE(NOW()) AND (YEAR(`renew_until`) - YEAR(`expiry_date`)) > 0
或者使用派生表
SELECT *
FROM
(
SELECT
`refno`, `subdomain`, `toplevels`, `renew_until`, `expiry_date`,
(YEAR(`renew_until`) - YEAR(`expiry_date`)) AS `renew_for`
FROM `testing_names`
) T
WHERE `expiry_date` >= DATE(NOW()) AND `renew_for` > 0
关于mysql - 意外结果 - MySQL SELECT 基于日期比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9160026/