mysql - 如何在 MySQL 中每 X 个月返回日期 = 现在的记录?

标签 mysql

我有一个每天运行一次的 PHP cron,我需要从 tableA 中获取与本月的天数(即:5 号)匹配的记录,但仅每 X 个月一次。

每个表A的记录作为tag_id,它关联表B中的记录,其中包含X个月的间隔:

表A

id | title | tag_id | date
---------------------------
1  | foo   | 1      | 2018-01-05 00:00:00
2  | bar   | 1      | 2018-12-05 19:00:00
3  | cat   | 2      | 2017-11-05 10:00:00
4  | car   | 3      | 2016-08-05 11:11:11

表B

id | label | months
-------------------
1  | text  | 1
2  | anim  | 3
3  | veh   | 6

tableA.tag_id = tableB.id

对于给定的数据,我想要一个查询,该查询将使用 tableB.months 来确定今天是否是具有匹配 tag_id 的记录的正确间隔日并返回记录。今天(1 月 5 日),查询将返回所有 4 条记录。

我不是要找人写查询,我只是想不通如何操作日期数据以使其像这样工作。

我开始考虑与 Modulo 相关的事情并确保它的 == 0 基于 tableB.months

这几乎可以完成工作:

MOD(DATEDIFF(NOW(), tableA.date), (tableB.months * 30)) = 0. 

但这有点古怪,因为月份的长度不同。

最佳答案

使用 TIMESTAMPDIFF() 获取月份差异。使用 DAY() 获取月份中的第几天:

SELECT *
FROM TableA a
JOIN TableB b
  ON  b.id = a.tag_id
  AND TIMESTAMPDIFF(MONTH, CURDATE(), DATE(a.date)) % b.months = 0
WHERE DAY(a.date) = DAY(NOW())

关于mysql - 如何在 MySQL 中每 X 个月返回日期 = 现在的记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48630151/

相关文章:

mysql sum and count per category append to matching category 行

mysql - 如何确保使用 docker-entrypoint-initdb.d 中的脚本初始化 docker 容器中的 MySQL?

PHP 带有多个下拉框的搜索

mysql - 根据年份检索数据库值?

php - 循环内循环以更新数据库记录

mysql - 在触发器内使用变量

mysql - 我应该使用什么数据类型在 MySQL 数据库中存储美国各州?

mysql - 两个表和它们的主键之间的关系

PHP 与 MySQL 查询的问题。该函数仅针对第一个 mysql 结果运行

mysql - 在mysql中更新记录时显式锁定行