予想外の結果 - 日付比較に基づくMySQL 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 を正しい方法で利用していますか?

1

2 答え

さらに見てみると、 HAVING を使うと、最も簡単な構文でMySQLで仕事をするように思えます。しかし、わかっている限り、それはMySQLが独自のことをしている別のケースです(対処してください)。したがって、SQL標準に近づけることが優先事項であれば、@ gbnのソリューションがおそらく最も良いでしょう。

HAVING を使用して:

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()) HAVING `renew_for` > 0
1
追加された