2011-12-02 100 views
9

所以我有这样的:SQL包括起始和终止日期

(CURDATE() BETWEEN start_date AND end_date) 

工作正常。

但是当CURDATE()是2011-12-02而end_date是2011-12-02它会抓住行吗?

如我的起始日期是2011-12-01 00:00:00和我的结束日期是2011-12-02 23:59:59

因此,只有当日期间但如果它的工作原理在end_date本身。

或者也许它应该检查的时间太多,因为它仍然需要与此查询选择时,例如2011-12-02 15:30:00。

我该怎么做?

+1

那么明显的答案是从'起始日期减去1天',并且为'end_date'添加1天,但是我并没有发布这个答案,因为可能有更好的SQL选择。 – DaveRandom

+0

@dave,别人做的! –

+0

之间的手段不包括开始和结束,所以结果是正确的。所以它只在日期介于两者之间时起作用,但不在介于end_date本身时。 –

回答

23

那么,你可以尝试

CURDATE() BETWEEN start_date AND DATE_ADD(end_date, INTERVAL 1 DAY) 
1

它将工作... BETWEEN作品包括边界值的。也就是说,

(CURDATE() BETWEEN start_date AND end_date) 

,包括日期,结束日期及任何一天使用下降start_date <= CURDATE() AND end_date > CURDATE()

+1

但是,如果start_date的时间是在午夜之后。 。 。 –

2

由于两个列时间戳,你需要确保时间不你绊倒。 为了不让时间绊倒你,把时间戳投给日期。

where current_date between cast(start_date as date) 
         and cast(end_date as date); 
4

之间
CURDATE() BETWEEN start_date AND ADDDATE(CURDATE(), INTERVAL 1 DAY); 
3

也许回答这个问题指的是一个bug在旧版本的MySQL,因为between是包容,这意味着它会抢在开始和结束日期之间的行包,而不是仅仅是开始之间结束前一天。

尝试这种情况:

SELECT CURDATE() BETWEEN CURDATE() AND CURDATE(); 

结果是1(即true)。 我相信最初的海报问题在于混合适当的日期(DATE)和日期与时间(DATETIMETIMESTAMP)。

尝试这种情况:

SELECT NOW() BETWEEN CURDATE() AND CURDATE(); 
SELECT NOW() BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 1 DAY); 

结果是0为第一选择和1用于第二。发生了什么是DATE相当于DATETIME零时间,所以除非NOW()恰好在午夜被调用,否则它将大于CURDATE()并且不在BETWEEN声明之外。 为了防止这种测试只是一个DATETIMEDATE部分使用DATE()功能:

SELECT DATE(NOW()) BETWEEN CURDATE() AND CURDATE(); 
0

投(END_DATE - 开始_为双精度)* 86400

相关问题