在mysql中选择两个日期之间的类别

时间:2016-05-16 08:52:26

标签: mysql select

我在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

enter image description here

我尝试过这个问题:

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并选择“银”类别,我会得到“金”类别的结果。实际上这两个日期之间没有白银类型。

我没有得到适当的数据。请帮助获取正确的数据。

5 个答案:

答案 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'