mysql - 与年份和年份相关联周功能

时间:2016-04-05 15:53:05

标签: mysql

mysql> select concat(yearval,weekval) as val1,concat(year(curdate()),week(curdate())) as val2 from wbr_weekly;
+-------+--------+
| val1  | val2   |
+-------+--------+
| 20161 | 201614 |
| 20162 | 201614 |
| 20163 | 201614 |
| 20164 | 201614 |
| 20165 | 201614 |
| 20161 | 201614 |
| 20162 | 201614 |
| 20163 | 201614 |
| 20164 | 201614 |
| 20165 | 201614 |
| 20161 | 201614 |
| 20162 | 201614 |
| 20163 | 201614 |
| 20164 | 201614 |
| 20165 | 201614 |
+-------+--------+
15 rows in set (0.00 sec)

并且

mysql> select concat(yearval,weekval) as val1 from wbr_weekly where concat(yearval,weekval) < concat(year(curdate()),week(curdate()));
+-------+
| val1  |
+-------+
| 20161 |
| 20161 |
| 20161 |
+-------+
3 rows in set (0.00 sec)

我的目标是返回比当前星期少的所有星期。我认为第二次查询会做什么。但事实并非如此。有人可以解释我的查询出了什么问题吗?

2 个答案:

答案 0 :(得分:1)

在字符串比较中,&#34; 20161&#34;,&#34; 20162&#34;等等将始终在lexigraphically小于&#34; 201614&#34;。您需要使用前导零填充周数以使比较工作:&#34; 201601&#34;,&#34; 201602&#34;等等:

select concat(yearval,weekval) as val1 from wbr_weekly 
    where concat(yearval, right(concat('0', weekval), 2)) 
      < concat(year(curdate()),week(curdate()));

答案 1 :(得分:0)

数据库正在进行字符串比较,而不是您想要的所需数字比较。将字符串“20165”与“201614”进行比较时,“20165”大于“201614”。

我的建议是:

  1. 如果这些是表中的数字字段,请不要将它们转换为WHERE子句的字符串。请尝试这样做:where yearval < year(curdate()) OR (yearval = year(curdate()) AND weekval < week(curdate()))
  2. 或者,将字段转换为字符串时,应在适当的位置填充前导零的字段。这将把“20165”变成“201605”,这比“201614”少。