Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 日期之间的SQL,包括开始日期和结束日期_Mysql_Sql - Fatal编程技术网

Mysql 日期之间的SQL,包括开始日期和结束日期

Mysql 日期之间的SQL,包括开始日期和结束日期,mysql,sql,Mysql,Sql,所以我有这个: (CURDATE() BETWEEN start_date AND end_date) 很好 但是当CURDATE()是2011-12-02,而end\u日期是2011-12-02时,它会抓住行吗 例如,我的开始日期是2011-12-01 00:00:00,结束日期是2011-12-02 23:59:59 因此,它只在日期介于之间时起作用,但如果它在结束日期本身则不起作用 或者它也应该检查时间,因为它仍然需要在2011-12-02 15:30:00时使用此查询进行选择 我该

所以我有这个:

 (CURDATE() BETWEEN start_date AND end_date) 
很好

但是当
CURDATE()
是2011-12-02,而
end\u日期是2011-12-02时,它会抓住行吗

例如,我的开始日期是2011-12-01 00:00:00,结束日期是2011-12-02 23:59:59

因此,它只在日期介于之间时起作用,但如果它在
结束日期
本身则不起作用

或者它也应该检查时间,因为它仍然需要在2011-12-02 15:30:00时使用此查询进行选择

我该怎么做呢?

嗯,你可以试试

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

它会起作用的<代码>介于
之间,包括边界值。就是

(CURDATE() BETWEEN start_date AND end_date)
包括开始日期、结束日期和介于两者之间的任何一天

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

使用
start\u date CURDATE()。
为了避免时间绊倒你,将时间戳转换为最新

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

这个问题的答案可能是指MySql旧版本中的一个bug,因为
between
是inclusive,这意味着它将获取开始日期和结束日期之间的行,而不仅仅是开始日期和结束前一天之间的行

试试这个:

SELECT CURDATE() BETWEEN CURDATE() AND CURDATE();
SELECT NOW() BETWEEN CURDATE() AND CURDATE();
SELECT NOW() BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 1 DAY);
结果是
1
(即
true
)。 我认为最初的海报问题在于混淆了正确的日期(
DATE
)和日期与时间(
DATETIME
TIMESTAMP

试试这个:

SELECT CURDATE() BETWEEN CURDATE() AND CURDATE();
SELECT NOW() BETWEEN CURDATE() AND CURDATE();
SELECT NOW() BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 1 DAY);
第一次选择的结果是
0
,第二次选择的结果是
1
。所发生的是一个
DATE
相当于一个时间为零的
DATETIME
,因此除非在午夜准确调用
NOW()
,否则它将大于
CURDATE()
,并且不在
BETWEEN
语句中。 要防止此测试,请使用
DATE()
函数,仅对
DATETIME
DATE部分执行以下操作:

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

cast(结束日期-开始日期为双精度)*86400

显而易见的答案是从
开始日期
中减去1天,然后在
结束日期
中加上1天,但我不会将此作为答案发布,因为可能有更好的SQL替代方案。@dave,其他人这样做了!介于之间意味着排除开始和结束,因此结果是正确的。所以它只在日期介于之间时有效,但如果它在结束日期本身就不起作用。但是如果开始日期的时间在午夜之后。