MySQL:根据日期获取当前和下一条记录

时间:2016-09-01 06:47:30

标签: mysql

我有这张桌子:

+----+-----------+------------+------------+-----------+
| id |   name    | date_start |  date_end  | is_active |
+----+-----------+------------+------------+-----------+
| 12 | Invernale | 2016-11-01 | 2017-03-31 |         1 |
| 15 | Estivo    | 2016-09-01 | 2016-09-01 |         1 |
+----+-----------+------------+------------+-----------+

我需要得到"当前"记录基于今天和下一个记录,今天基于。

在我的例子中,"当前"是id 15和" next"将是12。

今天,同样的查询将返回" NULL" (或没有记录)为当前和15为下一个。

2016年11月1日,当前将是12,接下来没有记录。

2017年4月1日,两人都不需要返回记录。

这些是我的查询,但两者都会返回id 15(今天)。

$sql_current = "SELECT * FROM $table WHERE date_start <= '$now' AND date_end >= '$now'";

$sql_next = "SELECT * FROM $table WHERE date_start >= '$now' ORDER BY date_start ASC LIMIT 1";

非常感谢

2 个答案:

答案 0 :(得分:0)

我猜你可以在UNION的帮助下在一个查询中获得这两条记录(如果有的话)(如果我没有误解)

(
    SELECT 
    *
    FROM tableName 
    WHERE CURDATE() BETWEEN date_start AND date_end
    LIMIT 1 
)
UNION 
(
    SELECT 
    *
    FROM tableName
    WHERE date_start > CURDATE() 
    ORDER BY date_start 
    LIMIT 1
);

修改

如果您想知道哪个条目是current,哪个条目是next,那么您可以添加一个额外的列currentOrNext,如下所示:

(
    SELECT 
    *,
    'current' AS currentOrNext
    FROM tableName 
    WHERE CURDATE() BETWEEN date_start AND date_end
    LIMIT 1 
)
UNION 
(
    SELECT 
    *,
    'next' AS currentOrNext
    FROM tableName
    WHERE date_start > CURDATE() 
    ORDER BY date_start 
    LIMIT 1
)

答案 1 :(得分:0)

如果我正确理解了这个问题,您需要获取包含当前日期(CURDATE() BETWEEN date_start AND date_end)的间隔以及未来的第一个间隔,并且不包含当前日期。

以下查询:

SELECT *
FROM tbl
WHERE CURDATE() <= date_end
ORDER BY date_end ASC
LIMIT 2

产生前两个(或更少)的时间间隔(或更短),以及未来的终止日期。(/ p>

客户端代码中的几行代码(可能是PHP)可以检查第一个返回行(如果有)的start_date值,以确定它是否可以用作&#34;当前&#34 ;或&#34; next&#34;:

  • 如果未返回任何行,则currentNULLnextNULL;
  • 如果第一个返回的行的start_date在过去,则current是第一个返回的行,next是第二个返回的行(if any) or NULL`(仅查询返回了一行;;
  • 其他currentNULLnext为第一行,第二行(如果有)不需要。