我在mysql中有这个表。我想在“start_date”和&之间选择数据为“rc_type”。 “结束日期”。
+----+--------+------------+------------+
| id | rc_type| start_date | end_date |
+----+--------+------------+------------+
| 1 | Gold | 16-05-2016 | 22-05-2016 |
| 2 | Silver | 20-05-2016 | 29-05-2016 |
+----+--------+------------+------------+
我的html表单有这三个字段。那么如何查找rc_type
?
我尝试过这个问题:
SELECT * FROM room_inventory WHERE rc_type='silver' BETWEEN '16-05-2016' AND '17-05-2016'
还有:
SELECT * FROM room_inventory WHERE start_date >= '16-05-2016' AND end_date <= '17-05-2016' AND rc_type='Gold'
如果我选择开始日期为16-05-2016,结束日期为17-05-2016并选择“银”类别,我会得到“金”类别的结果。实际上这两个日期之间没有白银类型。
我没有得到适当的数据。请帮助获取正确的数据。
答案 0 :(得分:1)
您需要将演示文稿与实际数据类型分开,即最好将日期列转换为实际日期格式而不是varchar。但是,为了获得正确的结果,您需要将字符串转换为正确的日期:
SELECT
*
FROM
room_inventory
WHERE
rc_type = 'Silver'
AND STR_TO_DATE(start_date, '%d-%m-%Y') > STR_TO_DATE('15-05-2016', '%d-%m-%Y')
AND STR_TO_DATE(end_date, '%d-%m-%Y') < STR_TO_DATE('30-05-2016', '%d-%m-%Y');
输出:
+----+---------+------------+------------+
| id | rc_type | start_date | end_date |
+----+---------+------------+------------+
| 2 | Silver | 20-05-2016 | 29-05-2016 |
+----+---------+------------+------------+
1 row in set
如果您不进行此类转换,您将收到如下错误的结果(我已将Silver的结束日期更改为29-06-2016):
输入:
mysql> select * from room_inventory;
+----+---------+------------+------------+
| id | rc_type | start_date | end_date |
+----+---------+------------+------------+
| 1 | Gold | 16-05-2016 | 22-05-2016 |
| 2 | Silver | 20-05-2016 | 29-06-2016 |
+----+---------+------------+------------+
2 rows in set
查询:
SELECT
*
FROM
room_inventory
WHERE
rc_type = 'Silver'
AND start_date > '15-05-2016'
AND end_date < '30-05-2016';
输出(错误):
+----+---------+------------+------------+
| id | rc_type | start_date | end_date |
+----+---------+------------+------------+
| 2 | Silver | 20-05-2016 | 29-06-2016 |
+----+---------+------------+------------+
1 row in set
这是因为MySQL执行char-by-char比较并确定29-06-2016 < 30-05-2016
哪个错误。因此,如果以varchar格式保留日期列,通常会有进一步的问题。
答案 1 :(得分:0)
您使用的日期格式错误, 正确的是年 - 月 - 日
你也错过了查询中的日期列,在本例中是查询搜索银类别,其中2016-06-16和2016-05-17之间的开始日期
SELECT * FROM room_inventory WHERE rc_type='silver' BETWEEN '2016-05-16' AND '2016-05-17'
答案 2 :(得分:0)
&#39;之间不需要&#39;试试这个:
SELECT * FROM room_inventory WHERE rc_type='silver' AND start_date = '16-05-2016' AND end_date = '17-05-2016'
答案 3 :(得分:0)
@Danilo提到你使用了错误的日期格式,
另一件事是您的比较日期语法的查询格式错误。
正确的语法:
SELECT * FROM room_inventory WHERE rc_type='silver' AND Your Date BETWEEN '2016-05-16' AND '2016-05-17'.
但是你在这里比较两个日期,所以这个查询不会像你期望的那样工作。
使用第二个查询时,请将您的日期格式更正为:
'SELECT * FROM room_inventory WHERE start_date >= '2016-05-16' AND end_date <= '2016-05-17' AND rc_type = 'Gold''
答案 4 :(得分:0)
逻辑错误,您在表格中的两列中使用 。 之间用于在 一列之间进行比较,因此您可以使用 AND 而不是之间。
SELECT * FROM room_inventory WHERE rc_type='silver' AND start_date = '16-05-2016' AND end_date = '17-05-2016'