您好我在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.
有人可以突出显示此查询中的错误吗?
答案 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生态系统。
tmp_start_time DATE
UPDATE holiday SET tmp_start_time = str_to_date(start_time,'%d-%m-%Y')
DATE
UPDATE holiday SET start_time = tmp_start_time
从现在开始,你可以像其他人一样使用BETWEEN
而不用str_to_date
我刚发现你的评论
问自己两次:你确定吗?遗憾的是我无法更改架构