我有以下查询:
SELECT COUNT(id) FROM users WHERE
DATE_FORMAT(FROM_DAYS(DATEDIFF(NOW(), birthday)), "%Y") >17 AND
DATE_FORMAT(FROM_DAYS(DATEDIFF(NOW(), birthday)), "%Y") <22
这应该返回 18 到 21 之间的人数,并且确实如此。问题是我不喜欢我两次运行同一组函数的方式。我该如何避免呢?
我有以下查询:
SELECT COUNT(id) FROM users WHERE
DATE_FORMAT(FROM_DAYS(DATEDIFF(NOW(), birthday)), "%Y") >17 AND
DATE_FORMAT(FROM_DAYS(DATEDIFF(NOW(), birthday)), "%Y") <22
这应该返回 18 到 21 之间的人数,并且确实如此。问题是我不喜欢我两次运行同一组函数的方式。我该如何避免呢?
MySQL 中有一个神奇的运算符,叫做BETWEEN
. 观察:
SELECT COUNT(`id`) FROM `users`
WHERE DATE_FORMAT(FROM_DAYS(DATEDIFF(NOW(),`birthday`)),"%Y")
BETWEEN 18 and 21;
请注意,要使用的值是包容性的,而不是排斥性的。
另请注意,您可以更简单地执行此操作:
WHERE DATE_ADD(`birthday`,INTERVAL 18 YEAR)
BETWEEN NOW() AND DATE_ADD(NOW(),INTERVAL 3 YEAR)
在这种特定情况下,您可以使用BETWEEN
运算符,但也可以在更一般的情况下使用子查询。
SELECT COUNT(id)
FROM users
WHERE DATE_FORMAT(FROM_DAYS(DATEDIFF(NOW(), birthday)), "%Y") BETWEEN 18 and 21;
子查询版本:
SELECT COUNT(id)
FROM (
SELECT
id,
DATE_FORMAT(FROM_DAYS(DATEDIFF(NOW(), birthday)), "%Y") days_from_birthday
FROM users
) as sub