2016-04-05 22 views
0
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的 - CONCAT與年及星期功能

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) 

我的目標是返回所有小於當前week.I認爲第二個查詢會做什麼想要的星期。但事實並非如此。有人可以解釋我的查詢出了什麼問題嗎?

回答

0

數據庫正在做一個字符串比較,而不是你想要的期望數值比較。當您比較字符串「20165」與「201614」時,「20165」大於「201614」。

我的建議是要麼:

  1. 如果這些是你的表的數字字段,不要把它們變成字符串的WHERE子句。試試這個:where yearval < year(curdate()) OR (yearval = year(curdate()) AND weekval < week(curdate()))
  2. 或者,將字段轉換爲字符串時,應在適當的位置填充前導零。這將使「20165」變成「201605」,這比「201614」少。
+0

謝謝戴夫。 ! ..接受 – user3114645

1

在字符串比較中,「20161」,「20162」等在詞法上總是小於「201614」。您需要墊帶前導零的週數,使比較工作:「201601」,「201602」等:

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

Upvote!。感謝Guido :)。短和鳴叫 – user3114645