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

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

最佳答案

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

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

"If you retrieve an ENUM value in a numeric context, the column value's index is returned."

该部分前面还指出:

If you wish to use a number as an enumeration value, you must enclose it in quotation marks. If the quotation marks are omitted, the number is regarded as an index. For this and other reasons—as explained later in this section—we strongly recommend that you do not use numbers as enumeration values.

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

关于Mysql 日期按从另一个表给出的月份间隔进行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26489639/

相关文章:

php - 如何使用 PATCH 更新一个简单的数据库字段?

php - Laravel 卡住了最后一个在论坛发帖的用户

crystal-reports - 尝试将 Crystal 报表中的总分钟数从日期差异转换为天数、剩余小时数和分钟数

mysql - 通过mysql获取两个日期的差值

sql-server - 在查询的 DATEADD 函数中使用参数

MySQL 执行 utc_date + 1 而不是使用 date_add(utc_date, Interval 1 day) 的含义

mysql - 我如何在MYSQL中选择两周前?

sql - DATE_DIFF 但只计算工作日

postgresql - PostgreSQL 中的 DATEADD 等价物

mysql - 将表与自身连接 vs 使用 Group By MySQL