使用MySQL

时间:2017-04-14 11:33:08

标签: mysql

您好我在MySQL表中存储了以下值:

--- ------------------------     -------------------
Id | StartDate (VARCHAR (20))  | EndDate(VARCHAR(20))
--- ------------------------     -------------------
1  | 03-04-2017                | 18-04-2017

我使用以下SQL来查找日期是否在StartDate和EndDate中:

SELECT 
(date_format(str_to_date('03-04-2017','%d-%m-%Y'),'%d-%m-%Y') >= StartDate 
AND 
date_format(str_to_date('03-04-2017','%d-%m-%Y'),'%d-%m-%Y') <= EndDate) AS 
valid 
FROM holiday

我的问题是,当我执行查询并提供03-04-2017时,它返回1但在我提供03-05-2017时也返回1.

有人可以突出显示此查询中的错误吗?

3 个答案:

答案 0 :(得分:2)

使用如下查询:

SELECT *
FROM holiday
WHERE
    STR_TO_DATE(StartDate,'%d-%m-%Y')
BETWEEN 
    str_to_date('03-04-2017','%d-%m-%Y')
AND
    str_to_date('03-04-2017','%d-%m-%Y');

<强>样品

mysql> SELECT IF(STR_TO_DATE('11-04-2017','%d-%m-%Y')
    ->             BETWEEN
    ->                 str_to_date('03-04-2017','%d-%m-%Y')
    ->             AND
    ->                 str_to_date('10-04-2017','%d-%m-%Y')
    ->
    -> ,'YES','NO') AS ANSWER;
+--------+
| ANSWER |
+--------+
| NO     |
+--------+
1 row in set (0,00 sec)

mysql> SELECT IF(STR_TO_DATE('04-04-2017','%d-%m-%Y')
    ->             BETWEEN
    ->                 str_to_date('03-04-2017','%d-%m-%Y')
    ->             AND
    ->                 str_to_date('10-04-2017','%d-%m-%Y')
    ->
    -> ,'YES','NO') AS ANSWER;
+--------+
| ANSWER |
+--------+
| YES    |
+--------+
1 row in set (0,01 sec)

mysql>

答案 1 :(得分:1)

您可以使用 <li ng-repeat="value in data | filter: input.val" ng-class="{'active':value.txt.indexOf(input.val)>0}" ng-click="input.val=value.txt" > {{value.txt}} <hr ng-show="!$last" style="margin-top: -1px; margin-bottom: 12px;"> </li> 运算符来比较日期,例如:

BETWEEN

<强>更新

如果日期存储为SELECT * FROM `table` WHERE '2017-04-03' BETWEEN start_date AND end_date; ,那么您需要在比较之前将其转换为varchar,例如:

date

这里是 SQL Fiddle

答案 2 :(得分:1)

所有其他答案都适合您的问题,但在我看来,您应该转换您的数据库。

这是理智的选择。

以奇怪的VARCHAR格式使用日期将在未来产生重大影响。它不仅影响你的表的性能,而且因为它而缺少整个MySQL date API生态系统。

  1. 添加临时列,例如tmp_start_time DATE
  2. 填写日期UPDATE holiday SET tmp_start_time = str_to_date(start_time,'%d-%m-%Y')
  3. 删除表中的旧varchar键
  4. 添加相同的密钥,但DATE
  5. 更新UPDATE holiday SET start_time = tmp_start_time
  6. 从现在开始,你可以像其他人一样使用BETWEEN而不用str_to_date

    我刚发现你的评论

      

    遗憾的是我无法更改架构

    问自己两次:你确定吗?