gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 23:32:36 27 4
gpt4 key购买 nike

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

这是带有月份的表格:

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com