Mysql日期选择从另一个表给出的月间隔

时间:2014-10-21 14:50:01

标签: mysql datediff dateadd

我在第一个表日期和月份在另一个表中 我试图在下个月找到所有到期的行 我需要显示到期日期和日期

这是几个月的表格:

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-01-01

我尝试查询:

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);

1 个答案:

答案 0 :(得分:0)

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

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

  

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

它也在该部分的前面说明:

  

如果要将数字用作枚举值,则必须将其括在引号中。如果省略引号,则将该数字视为索引。由于这个原因和其他原因 - 我们强烈建议您不要使用数字作为枚举值。

我相信你的ENUM指数为2,所以你的INTERVAL公式只增加了2个月。看起来这里最好的选择是将该值存储为INTEGER并处理前端的字段验证。