Mysql 选择Left Join两个表,其中Today位于第二个表的两个Datetime列之间

Mysql 选择Left Join两个表,其中Today位于第二个表的两个Datetime列之间,mysql,Mysql,编辑以进一步简化此操作 让我们看看这个结构: 表1:idProduct int | Name varchar 表2:idDay int | idProduct int |日期|开始日期时间|日期|结束日期时间 idProduct是两个表中的公共列。表2包含与此类似的数据: 0, 2, 11/22/2012, 11/22/2012 1, 2, 11/23/2012, 11/23/2012 2, 2, 11/24/2012, 11/24/2012 3, 2, 00/00/0000, 11/25/20

编辑以进一步简化此操作

让我们看看这个结构:

表1:idProduct int | Name varchar

表2:idDay int | idProduct int |日期|开始日期时间|日期|结束日期时间

idProduct是两个表中的公共列。表2包含与此类似的数据:

0, 2, 11/22/2012, 11/22/2012
1, 2, 11/23/2012, 11/23/2012
2, 2, 11/24/2012, 11/24/2012
3, 2, 00/00/0000, 11/25/2012
4, 2, 11/25/2012, 00/00/0000
请注意,日期开始、日期结束或两者都可以为零,在这种情况下,该上限或下限被视为未绑定/无限制

在上述情况下,我只想选择ID为2的idProduct,前提是今天的日期介于日期开始的最早日期和日期结束的最晚日期之间。 如果开始日期为00/00/0000,则始终返回产品,但如果结束日期为将来。相反,日期结束为全零,日期开始设置为零。如果两列都为零,则返回产品

select
  t1.idproduct,
  t1.name
from table as t1
  left join table2 as t2
    on t1.idproduct = t2.idproduct
where date(date_start) < date(now())
    and date(date_end) > date(now())
编辑

select
  t1.idproduct,
  t2.idproduct,
  t2.name
from table as t1
  left join (select
               max(idproduct),
               name
             from table2
             where date(date_start) < date(now())
                 and date(date_end) > date(now())) as t2
    on t1.idproduct = t2.idproduct

当然,它不会选择那些结束日期为00:00:00的记录,我看不到你问题中的左加入要求:只在你的标题中。所以

SELECT t1.idProduct, t1.Name
FROM table1 t1
INNER JOIN table2 t2 ON t1.idProduct = t2.idProduct
WHERE DATE(t2.date_start) < DATE(NOW())--this will also take values with DATETIME = 0000
AND (DATE(t2.date_end) > DATE(NOW()) OR YEAR(t2.date_end) = 0)
GROUP BY t1.idProduct, t1.Name
或者,如果要检查产品是否至少有一个开始日期小于今天或0,以及至少有一个结束日期大于今天或0,即使开始日期和结束日期不共享相同的idDay:

SELECT t1.idProduct, t1.Name
FROM table1 t1
WHERE t1.idProduct IN
    (SELECT t2.IdProduct
    FROM table t2
    GROUP BY t2.IdProduct
    HAVING 
    MIN(t2.date_start) <= DATE(NOW()) AND 
    (MAX(t2.date_end) >= DATE(NOW()) OR YEAR(MAX(t2.date_end)) = 0))
这将需要:

最小开始日期=0,最大结束日期=0

最小开始日期=0,最大结束日期>=今天


最小开始日期开始和结束日期是否存储为日期时间?还是时间戳?还是?编辑。它们都是DATETIME。我的查询仍然有效,因为我正在从DATETIME字段HMMM提取日期,如果date_end为零,这将为同一产品返回多行,其中日期介于date_start和date_end之间,因为表2包含多行具有相同idProduct。响应良好。谢谢,但这在我的情况下不起作用,因为date_end和date_start对于每个单独的行都包含相同的日期,但每行都有不同的日期,因此两个日期检查之间的and运算符在至少一种情况下失败。如果两列包含相同的日期,则日期不能同时在今天之前或之后。另外,我不关心第二个表的行的值。我只想返回表2中至少有一天的最长日期在今天之后,并且至少有一天的最短日期在今天之前的产品。@user1364793如果当date\u start和date\u end=0时失败,那么我在第二个查询最后一行中的更改就可以了。你说过如果max end_date=0000,你会得到结果吗?这是真的吗?如果是,第二个查询现在应该可以工作了。我相信您在第二个查询中遗漏了FROM子句。另外,考虑我对问题的编辑。我还更改为=inclusive-between,而不是exclusive。看我最后的解释,如果是错的,我没有理解你的要求。