首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按月间隔从另一个表中选择Mysql日期

问按月间隔从另一个表中选择Mysql日期
EN

Stack Overflow用户
提问于 2014-10-21 14:50:00
回答 1查看 263关注 0票数 0

我有第一个表日期和另一个表中的月份,我试图在下个月找到所有即将到期的行,我需要显示过期日期和天数。

这张桌子上有几个月:

代码语言:javascript
复制
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;

我尝试使用此查询获得到期日期,但返回不正确的结果:

代码语言:javascript
复制
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。

我试着查询如下:

代码语言:javascript
复制
SELECT 
DATE_ADD(t1.`date`, INTERVAL (SELECT validity FROM providers WHERE id = t1.provider_id) MONTH) 
FROM table t1 

如果您有大型数据库,此查询工作正常,但速度非常慢。

查询的框架需要如下所示:

代码语言:javascript
复制
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);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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个月的日期。这里的最佳选择似乎是将该值存储为整数,并在前端处理字段验证。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26489639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档