2012-10-01 245 views
49

我想运行一个mysql select语句,它看起来今天的日期,只返回当天注册的结果。我目前正在尝试以下,但它似乎并没有工作。MySQL选择日期等于今天

SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
    FROM users 
    WHERE users.signup_date = CURDATE() 

我修改我的SELECT语句来此,感谢球员。

SELECT id FROM users WHERE DATE(signup_date) = CURDATE()

+0

看起来'signup_date'是日期时间字段 – Serjio

+0

@Serjio是的,它当前是日期时间字段。 – Jako

+0

是什么signup_date'的'的数据类型,如果它包含的时间,那么你将要使用的DATE_FORMAT在'WHERE'条款剥夺匹配'CURDATE()的时候' – Taryn

回答

111
SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
FROM users 
WHERE DATE(signup_date) = CURDATE() 
+0

是否有必要使用DATE(),即使字段类型为Date? – rashidnk

+1

@rashidnk号虽然他没有在问题中说清楚,但该字段显然是'DATETIME'类型。 – Barmar

+1

虽然此解决方案绝对正确,但它不能很好地扩展(即使存在这样的索引,也不能在'signup_date'上使用索引)。更喜欢[Serjio的解决方案](http://stackoverflow.com/a/12677822/1446005)。 – RandomSeed

9

听起来像是你需要添加格式为WHERE

SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
FROM users 
WHERE DATE_FORMAT(users.signup_date, '%Y-%m-%d') = CURDATE() 

SQL Fiddle with Demo

+5

告别你的表演。此查询从不使用索引 – Serjio

12

,如果您有它signup_date

此查询将使用索引
SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
    FROM users 
    WHERE signup_date >= CURDATE() && signup_date < (CURDATE() + INTERVAL 1 DAY) 
+0

对这个问题的看法是荒谬的。这实际上是首选方法,因为与其他方法不同,此查询可以利用'signup_date'上的索引。 – RandomSeed

+0

@RandomSeed在两次之间测试'signup_date'的一般想法是正确的,但时间不是。它应该在当前日期的'00:00'和'23:59:59'之间。 – Barmar

+1

@Barmar是的,你是对的。我确定了答案。 – RandomSeed

相关问题