我正在try 获取starts_at个列周年纪念中的任何一个与范围期间匹配的记录,但不是与ends_at个周年纪念日匹配的记录.

例如,我们有这样一张subscriptions张桌子:

id starts_at ends_at
1 2015-01-01 2016-01-01
2 2014-01-01 2017-01-01

范围在2015-12-012016-02-01之间.

我需要ID: 2的,因为它的一个周年纪念日(2016-01-01)在范围内,而ends_at不在范围内.

SQLFiddle

推荐答案

创建一个年份查找表,如下所示,并根据您的数据(比如1980到2050)插入行:

CREATE TABLE IF NOT EXISTS `year_lookup` (
  `year_value` int,
  PRIMARY KEY (`year_value`)
) DEFAULT CHARSET=utf8;  

INSERT INTO `year_lookup` (`year_value`) VALUES
  ('2010'),
  ('2011'),
  ('2012'),
  ('2013'),
  ('2014'),
  ('2015'),
  ('2016'),
  ('2017');

然后,使用年份查找来加入订阅表,以查找所有可能的周年纪念.最后,根据starts_at BETWEEN和end_at NOT BETWEEN过滤记录,如下所示.

-- Anniversary
SELECT DISTINCT Final.id FROM (
  SELECT s.id AS id, DATE_ADD(MAKEDATE(y.year_value, 1), INTERVAL DAYOFYEAR(starts_at)-1 DAY) AS starts_at, ends_at 
  FROM subscriptions AS s
  INNER JOIN year_lookup AS y
      ON y.year_value BETWEEN YEAR(starts_at) AND YEAR(ends_at)
  ) AS Final
WHERE    
   ((starts_at BETWEEN '2015-12-01' AND '2016-02-01') 
     AND (ends_at NOT BETWEEN '2015-12-01' AND '2016-02-01')) ; 

请参阅此SQL Fiddle

Mysql相关问答推荐

MySQL 8.0.34-从后端系统管理AWS RDS上的持久连接内存使用

MySQL:一个查询中的SELECT语句,用于从一个表中检索所有数据,并仅从另一个表中检索一个数据

在MySQL查询中查找和替换表内的值

Mysql - 按周分组但从 1 开始计数

如果存在N个特殊行,如何 Select 它们,其余的必须填充常规行,总行数不能超过MySQL中的X行?

为大表优化 Django 模型

数据导入和默认目标架构空列表. (Mysql 工作台 8)

我在 mysql 查询中需要帮助,我想在年龄之间按年龄过滤器分组,并显示 0 计数之间找不到的数据

MySQL表中给定字段的每个不同值的连续记录形成对

SQL从具有相同列的行中 Select 最后一行

如何通过if语句对SQL查询进行排序

如果在表中多次发现 a 列中的相同值,则排除所有行

使用 ON DUPLICATE KEY 将列增加一定数量 MySQL NodeJS

使用 MySQL LIMIT、OFFSET 进行分页

MySQL Group By 和 Sum 其他列的总值

如何为 php 启用 mysqlnd?

如何存储重复日期牢记夏令时

MySQL:ALTER IGNORE TABLE 给出违反完整性约束

从 MySQL JSON 数据类型中提取不带引号的值

当运行 UPDATE ... datetime = NOW();所有更新的行都会有相同的日期/时间吗?