2011-05-06 53 views
1

说我想选择两个日期之间的所有记录加上一条记录之前和该日期之后的一条记录?所有记录按日期排序。SELECT记录MySQL:在日期+ 1之间

+0

它是日期还是日期?日期时间之前/之后的一条记录可能相隔数秒钟......需要在此处明确。 – 2011-05-06 17:32:33

回答

2
(select * from t where date < start_date order by date desc limit 1) 
    union (select * FROM t WHERE date between start_date and end_date) 
    union (select * from t where date > end_date order by date asc limit 1) 
6

您可以使用联合限制语句的联合。像下面的东西(未经测试,无法访问MySQL)。

(select column from table where datefield > startdate and datefield < stopdate) 
union 
(select column from table where datefield < startdate order by datefield desc limit 1) 
union 
(select column from table where datefield > stopdate order by datefield limit 1) 

这会给你下一行,不管它在哪里落在明天。

感谢您的语法修复,小马。

+1

根据OP的措辞,这似乎是正确的,但不知道是否有意留下**开始/停止日期,或者范围应该是> =还是<=? – 2011-05-06 17:31:26

+0

MySQL错误1064-语法错误,因为您无法在UNION语句中将首次置于括号/父项中的LIMIT/ORDER BY应用于特定查询的情况下,无法在UNION中使用LIMIT或ORDER BY。此外,联盟会删除重复 - UNION ALL不会,并且速度更快。 – 2011-05-06 17:43:59

+0

那么每个语句都变成了括号? – 2011-05-06 17:46:03

-1
SELECT * 
    FROM table 
WHERE date BETWEEN DATE_ADD(current_date(), INTERAL -1 DAY) 
       AND DATE_ADD(current_date(), INTERVAL 1 DAY); 
+0

+1:正确,并且如果“日期”列中存在索引,将使用索引。 – 2011-05-06 17:32:24

+1

这不包括在所有/ **日期前的**记录吗?以为OP只需要在每一端的记录... – 2011-05-06 17:33:47

+3

这听起来不像他要求的日期+ 1天。我读它是因为他要求提供日期中的记录以及下一个记录,无论是第二天还是结束日期之后的一年。 – 2011-05-06 17:34:15

0

您可以使用函数来增加或减少值,如:

select * from table where field1 < ADDDATE( CURTIME() , INTERVAL 1 DAY) 

入住这link那里有一些例子。