我在第一个表日期和月份在另一个表中 我试图在下个月找到所有到期的行 我需要显示到期日期和日期
这是几个月的表格:
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);
答案 0 :(得分:0)
查看MySQL的ENUM数据类型的帮助页面:http://dev.mysql.com/doc/refman/5.0/en/enum.html
在这里,您了解到当您从ENUM类型字段中撤回数字类型时,您将获得ENUM值的INDEX,而不是值本身。它声明
"如果在数字上下文中检索ENUM值,则为该列 返回值的索引。"
它也在该部分的前面说明:
如果要将数字用作枚举值,则必须将其括在引号中。如果省略引号,则将该数字视为索引。由于这个原因和其他原因 - 我们强烈建议您不要使用数字作为枚举值。
我相信你的ENUM指数为2,所以你的INTERVAL公式只增加了2个月。看起来这里最好的选择是将该值存储为INTEGER并处理前端的字段验证。