Página 22
Há uma pequena complicação se o mês corrente é dezembro. Você não faz somente a soma do número do mês (12) e espera animais produzidos em mês 13, porque não há tal mês. Você espera animais produzidos em janeiro (mês 1).
Você pode até mesmo escrever a pergunta de modo que isto trabalhe com nenhuma matéria do mês corrente. Aquele caminho que você não tem que usar um número de mês particular na pergunta. DATE_ADD() permite você somar um intervalo do tempo para uma data dada. Se você soma um mês ao valor de NOW(), então o mês desfaz-se MONTH(), o resultado produzido é o mês em que esperávamos os aniversários:
mysql> SELECT name, birth FROM pet
-> WHERE MONTH(birth) = MONTH(DATE_ADD(NOW(), INTERVAL 1 MONTH));
Um caminho diferente para efetuar a mesma tarefa é somar 1 para obter o próximo mês depois o mês corrente:
mysql> SELECT name, birth FROM pet
-> WHERE MONTH(birth) = MOD(MONTH(NOW()), 12) + 1;
Note que MÊS volta um número entre 1 e 12. e MOD(alguma coisa,12) volta um número entre 0 e 11. Assim a adição tem que estar depois de MOD() de outra maneira nós poderíamos ir de Novembro (11) para Janeiro (1).
Trabalhando com valores NULOS
O valor NULL pode ser surpreendente até você se acostumar a isto. Conceitualmente, valores NULL são valores desconhecidos e isto é tratado diferentemente dos outros valores.
Para testar NULL, você não pode usar os operadores de comparação de aritmética tal como =, < ou !=. Para demonstrar isto, tenta a seguinte pergunta:
mysql> SELECT 1 = NULL, 1 != NULL, 1 < NULL, 1 > NULL;
+----------+-----------+----------+----------+
| 1 = NULL | 1 != NULL | 1 < NULL | 1 > NULL |
+----------+-----------+----------+----------+
| NULL | NULL | NULL | NULL |
+----------+-----------+----------+----------+
Claramente você obtém nenhum resultado significativo destas comparações. Use os operadores IS NULL e IS NOT NULL:
mysql> SELECT 1 IS NULL, 1 IS NOT NULL;
+-----------+---------------+
| 1 IS NULL | 1 IS NOT NULL |
+-----------+---------------+
| 0 | 1 |
|