我有第一个表日期和另一个表中的月份,我试图在下个月找到所有即将到期的行,我需要显示过期日期和天数。
这张桌子上有几个月:
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);发布于 2014-10-21 14:54:54
查看MySQL:http://dev.mysql.com/doc/refman/5.0/en/enum.html的ENUM数据类型上的帮助页面
在这里,您将了解到,当您从ENUM类型字段中提取一个数字类型时,您将得到ENUM值的索引,而不是值本身。它说
“如果在数值上下文中检索ENUM值,则返回列值的索引。”
它还在该节前面指出:
如果希望将数字用作枚举值,则必须将其括在引号中。如果省略引号,则将该数字视为索引。由于这个原因和其他原因--正如本节后面所解释的--我们强烈建议您不要使用数字作为枚举值。
我相信你得到的ENUM指数为2,所以你的间隔公式只是增加了2个月的日期。这里的最佳选择似乎是将该值存储为整数,并在前端处理字段验证。
https://stackoverflow.com/questions/26489639
复制相似问题