2016-04-05 3 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 - 年&週機能付き連結

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が2番目のクエリがやりたいだろうと思ったよりも少ないすべての週を返すことです。しかしそれはしませんでした。誰かが私の質問に間違っていることを説明できますか?

答えて

0

データベースではなく、あなたが望む目的の数値比較の文字列比較をしているあなたは、比較作業をするために、先行ゼロでパッドに週番号が必要です。文字列 "20165"と "201614"を比較すると、 "20165"は "201614"より大きくなります。これらは、あなたのテーブル内の数値フィールドの場合は、WHERE句の文字列にそれらを有効にしない

  1. 私のアドバイスは、どちらかになります。これを代わりに試してみてください:where yearval < year(curdate()) OR (yearval = year(curdate()) AND weekval < week(curdate()))

  2. また、フィールドを文字列にするときは、必要に応じて先頭にゼロを付けてフィールドを埋めてください。これは「20165」を「201605」に変換し、「201614」よりも小さくなります。
+0

ありがとうDave。 ! ..受け入れられた – 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!ありがとうございました:)。ショートとチーベット – user3114645