mysql - 意外结果 - MySQL SELECT 基于日期比较

标签 mysql sql date select

我在使用 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/

相关文章:

ios - Swift 3 : Find out, 如果日期已更改 - 怎么办?

mysql - 如何将一列中的字符串拆分为两列

php - 如何通过导航回 php 中的引用页面来限制更新或多次插入?

PHP 准备的 sql 语句在调用具有特殊字符的列时中断

处理时区转换的 JavaScript 库

java - 在Java中减去两个日期

mysql - 使用 SUM + 计算的 SQL 查询,使用 LEFT JOIN

java - com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException | JAVA

sql - 选择不同列上具有不同值的行

sql - 在有 in 子句的地方将 SQL 转换为 Linq