2

用户可以在指定天数(例如 30 天)内注册高级列表。

tblPremiumListings

user_id     days     created_date  
---------------------------------
1           30        2013-05-21
2           60        2013-06-21
3           120       2012-06-21

我将如何选择在高级列表中还有剩余天数的记录。

4

5 回答 5

5
SELECT *
FROM tblPremiumListings
WHERE created_date + INTERVAL `days` DAY >= CURDATE()
于 2013-07-22T06:05:29.953 回答
2

使用 INTERVAL 最容易阅读

select * 
  from tblPremiumListings
 where created_date + interval days day >= now();

但我也会将表更改为而created_date不是days存储end_date。这样查询是

select *
  from tblPremiumListings
 where end_date >= now();

这样做的好处是您可以在 end_date 上放置一个索引并快速找到所有已结束的高级列表,对于您的原始表,您将始终需要进行全表扫描才能找到过期列表的记录。

于 2013-07-22T06:13:05.670 回答
0
SELECT * FROM 
tblPremiumListings 
WHERE (DATEDIFF(NOW(), created_date) - days)  <= 0

看看能不能解决你的问题

于 2013-07-22T06:05:15.017 回答
0

获得结果的一种方法:

SELECT t.user_id
     , t.days
     , t.created_date
  FROM tblPremiumListings t
 WHERE t.created_date + INTERVAL t.days DAY > DATE(NOW())

您可能需要一个>=比较运算符(而不是>),具体取决于您定义剩余天数的方式。

注意:此查询的访问计划将全面扫描所有行,因为 MySQL 无法对索引进行范围扫描。对于大型集合,拥有可以被索引以满足查询的列可能会提高性能,例如

WHERE t.expire_date > DATE(NOW()) 
于 2013-07-22T06:08:35.437 回答
0

试试这个...

SELECT * FROM 
tblPremiumListings 
WHERE DATE_ADD(created_date, days)>DATE(NOW())
于 2013-07-22T06:11:17.390 回答