我在第一张桌子上有日期和月份在另一张桌子上
我试图找到下个月所有即将到期的行
我需要显示到期日期和天数

这是带有月份的表:

CREATE TABLE IF NOT EXISTS `providers` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(24) NOT NULL,
  `validity` enum('6','12','24') NOT NULL DEFAULT '12' COMMENT 'months',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;


我尝试通过此查询获取到期日期,但返回的结果不正确:

SELECT DATE_ADD(t1.`date`, INTERVAL p.`validity` MONTH) AS expiring
FROM table t1
LEFT JOIN providers p ON p.id = t1.provider_id


如果日期为:2014-01-01,有效期为12个月,结果为2014-03-01
我不知道这是怎么发生的,正确的结果必须是2015年1月1日

我尝试查询:

SELECT
DATE_ADD(t1.`date`, INTERVAL (SELECT validity FROM providers WHERE id = t1.provider_id) MONTH)
FROM table t1


该查询正常运行,但如果数据库很大,则查询速度非常慢。

查询的骨架必须是这样的:

SELECT
  DATE_ADD(date, INTERVAL 12 MONTH) AS expiring,
  datediff(NOW(), expiring) AS days
FROM
  table
WHERE
  expiring BETWEEN NOW() AND DATE_ADD(expiring, INTERVAL 1 MONTH);

最佳答案

在MySQL的ENUM数据类型上查看帮助页面:http://dev.mysql.com/doc/refman/5.0/en/enum.html

在这里,您了解到,当从ENUM类型的字段中拉回数字类型时,您将获得ENUM值的INDEX,而不是值本身。它指出


  “如果您在数字上下文中检索ENUM值,则该列
  返回值的索引。”


该部分前面还指出:


  如果希望将数字用作枚举值,则必须将其用引号引起来。如果省略引号,则将该数字视为索引。由于这个和其他原因(如本节后面所述),我们强烈建议您不要将数字用作枚举值。


我相信您的ENUM索引为2,因此您的INTERVAL公式仅将日期增加了2个月。似乎这里最好的选择是将该值存储为INTEGER并在前端处理字段验证。

关于mysql - MySQL日期按月间隔从另一个表中选择,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26489639/

10-12 13:04
查看更多