PHP SQL选择日期之间的行

PHP SQL选择日期之间的行,php,mysql,sql,wordpress,date,Php,Mysql,Sql,Wordpress,Date,我正在尝试创建一个预订系统,希望检查两个日期之间是否已经进行了预订。但是,我的SQL总是返回false $reservation_date_start = date('y-m-d', strtotime($fields['reservation_date_start'])); $reservation_date_end = date('y-m-d', strtotime($fields['reservation_date_end'])); // Save data to database $t

我正在尝试创建一个预订系统,希望检查两个日期之间是否已经进行了预订。但是,我的SQL总是返回false

$reservation_date_start = date('y-m-d', strtotime($fields['reservation_date_start']));
$reservation_date_end = date('y-m-d', strtotime($fields['reservation_date_end']));

// Save data to database
$table_name = $wpdb->prefix . 'mb_bookings';

$date_exists = $wpdb->get_results("SELECT * FROM $table_name 
WHERE (reservation_date_start >= $reservation_date_start AND reservation_date_start < $reservation_date_end ) 
OR (reservation_date_end >= $reservation_date_start AND reservation_date_end < $reservation_date_end) 
AND (accommodation_id = $accommodation_id)"
);
$reservation\u date\u start=date('y-m-d',strottime($fields['reservation\u date\u start'));
$reservation\u date\u end=date('y-m-d',strottime($fields['reservation\u date\u end'));
//将数据保存到数据库
$table_name=$wpdb->prefix'mb_预订;
$date\u exists=$wpdb->get\u results(“从$table\u名称中选择*
其中(预订日期开始>=$预订日期开始和预订日期开始<$预订日期结束)
或(预订日期结束>=$预订日期开始和预订日期结束<$预订日期结束)
和(住宿费=住宿费)
);
我已经尝试过使用
BETWEEN
函数,但也没有成功

数据库中的日期是正确的(y-m-d)

Db示例:


任何帮助都将不胜感激,因为我已经挣扎了好几天了…

日期格式
y-m-d
给出了16-04-01。将其更改为
Y-m-d
以获得2016-04-01。那个么查询应该可以工作了

如果我正确理解您的需求,您需要检查两个时段是否重叠。我认为应该这样做(mark添加了参数和撇号):

选择*
来自$table\u name
哪里
(
(
STR_TO_DATE(“$reservation_DATE_start”,“%Y-%m-%d”)reservation_DATE_start
)
或
(
STR_TO_DATE('$reservation_DATE_end','%Y-%m-%d')>=预订日期_start
及
STR_TO_DATE(“$reservation_DATE_start”,“%Y-%m-%d”)
编辑

重叠的简化条件:

SELECT *
FROM $table_name 
WHERE 
        STR_TO_DATE('$reservation_date_end', '%Y-%m-%d') >= reservation_date_start
    AND STR_TO_DATE('$reservation_date_start', '%Y-%m-%d') <= reservation_date_end
    AND accommodation_id = $accommodation_id
选择*
来自$table\u name
哪里
STR_TO_DATE('$reservation_DATE_end','%Y-%m-%d')>=预订日期_start

和STR_TO_DATE('$reservation_DATE_start','%Y-%m-%d')日期格式
Y-m-d
给出16-04-01。将其更改为
Y-m-d
以获得2016-04-01。那个么查询应该可以工作了

如果我正确理解您的需求,您需要检查两个时段是否重叠。我认为应该这样做(mark添加了参数和撇号):

选择*
来自$table\u name
哪里
(
(
STR_TO_DATE(“$reservation_DATE_start”,“%Y-%m-%d”)reservation_DATE_start
)
或
(
STR_TO_DATE('$reservation_DATE_end','%Y-%m-%d')>=预订日期_start
及
STR_TO_DATE(“$reservation_DATE_start”,“%Y-%m-%d”)
编辑

重叠的简化条件:

SELECT *
FROM $table_name 
WHERE 
        STR_TO_DATE('$reservation_date_end', '%Y-%m-%d') >= reservation_date_start
    AND STR_TO_DATE('$reservation_date_start', '%Y-%m-%d') <= reservation_date_end
    AND accommodation_id = $accommodation_id
选择*
来自$table\u name
哪里
STR_TO_DATE('$reservation_DATE_end','%Y-%m-%d')>=预订日期_start
和STR_TO_DATE('$reservation_DATE_start','%Y-%m-%d')SELECT*FROM$table_name
其中,在预订日期开始和$reservation日期结束之间提交的日期

从$table\u name中选择*

其中,在预订日期开始和$reservation日期结束之间提交的日期

你的错误是什么?其中(a>b)或(b>a)应该是((a>b)或(b>a))加上额外的括号,
reservation\u date\u start
reservation\u date\u end
列的数据类型是什么?@Alex7我遇到的问题是查询总是返回0。我试图添加额外的括号,但仍然没有成功。@AshwaniGoyal数据类型是Date
code
reservation\u date\u start date NOT NULL
code
出现了什么错误?其中(a>b)或(b>a)应该是((a>b)或(b>a))加上额外的括号,
reservation\u date\u start
reservation\u date\u end
列的数据类型是什么?@Alex7我遇到的问题是查询总是返回0。我试图添加额外的括号,但仍然没有成功。@AshwaniGoyal数据类型是Date
code
reservation\u date\u start date非空
code
很遗憾,它没有任何效果。$date\u exists查询仍然返回0。非常感谢!你的解决方案终于起作用了!当我试图理解您的解决方案时,这是否意味着mySQL不能读取任何PHP日期值?因此它需要有stru-to-DATE函数?@Thjeu我不知道。我不是真正的mySQL用户,所以我在日期中添加了STR_,以防万一。在PostgreSQL中,它只适用于字符串
'2016-04-01'
。不幸的是,它没有任何效果。$date\u exists查询仍然返回0。非常感谢!你的解决方案终于起作用了!当我试图理解您的解决方案时,这是否意味着mySQL不能读取任何PHP日期值?因此它需要有stru-to-DATE函数?@Thjeu我不知道。我不是真正的mySQL用户,所以我在日期中添加了STR_,以防万一。在PostgreSQL中,它只适用于字符串
'2016-04-01'
。不幸的是,它没有任何效果。$date\u exists查询仍然返回0。遗憾的是,它没有任何效果。$date\u exists查询仍然返回0。我不理解您的解决方案,因此如果我错了,请更正我。但并没有一个栏目叫做“date_Field”,所以我不知道这是怎么回事。我不明白你们的解决方案,所以如果我错了,请纠正我。但是没有一个专栏叫做“date_Field”,所以我不知道这是怎么回事。
$reservation_date_start = date('Y-m-d',strtotime($fields['reservation_date_start']));
$reservation_date_end = date('Y-m-d', strtotime($fields['reservation_date_end']));