2016-09-01 55 views
1

当前和下一个记录我有这个表: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和“下一个”将是12

今天,同样的查询将返回“NULL”(或者没有记录)为下一电流和15。

在十一月01st 2016年,目前为12和未来没有记录。

在四月01st 2017年都将需要返回任何记录。

这是我的查询,但都将返回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"; 

非常感谢您

+0

**在我的例子, “当前” 的ID 15和 “下一个” 将是15。**是正确的吗?第三行。 – 1000111

+0

@ 1000111不,这是一个错误。刚刚编辑。谢谢! – sineverba

回答

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 
) 
0

如果我理解正确的问题,你需要获得一个包含当前日期(CURDATE() BETWEEN date_start AND date_end),这是在未来的第一时间间隔的时间间隔和不包含当前日期。

以下查询:

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

产生不过去的前两个时间间隔(或更小)(终止日期是将来的)。

一对夫妇在客户端代码的代码行(PHP可能)可查询返回的第一行(如果有的话)的start_date值来决定它是否可以作为“当前”或“下一个”:

  • 如果没有行返回然后currentNULLnextNULL;
  • 否则,如果所述第一返回的行的start_date是过去然后current是所述第一返回的行和next是第二返回行(if any) or NULL`(只有一行被查询返回);
  • 别的currentNULLnext是第一行和第二行(如果有的话)是不必要的。