我目前将用户的出生日期存储为DATE
字段,其中0000-00-00
为默认值。
我正在使用此查询来获取30岁或以上的用户。
SELECT *
FROM myUsers
WHERE birth_date != '0000-00-00'
AND DATE(birth_date) < DATE( DATE_SUB( NOW() , INTERVAL 30 YEAR ) )
ORDER BY user_id desc LIMIT 0,10
这是正确的SQL查询来获得我想要的吗? (让用户年龄大于或者说年龄已经超过30岁)并且可以进行改进/优化吗?
答案 0 :(得分:2)
并非总是错误,但我不想将variables
的日期存储为默认值,而是使用NULL(除非它具有特殊含义,您必须将其与NULL区分开)
然后您使用0000-00-00
功能从日期时间字段中删除时间信息,但由于DATE()
不是日期时间字段,因此没有理由使用它。如果存在,这可以使用索引。
然后您可以使用此查询:
birth_date
(如果默认值为NULL,则无需检查它)。只是决定是否要使用SELECT *
FROM myUsers
WHERE birth_date <= CURRENT_DATE()-INTERVAL 30 YEAR
ORDER BY user_id DESC
LIMIT 0,10
或<
,但我更喜欢后者,因为它将包括他们生日那天的人。
在birth_date和user_id字段上建立索引是一个好主意。
答案 1 :(得分:1)
如果您有0000-00-00
个值,请使用BETWEEN
,如下所示:
SELECT *
FROM myUsers
WHERE birth_date BETWEEN '0000-01-01' and CURRENT_DATE() - INTERVAL 30 YEAR
ORDER BY user_id DESC
LIMIT 0, 10