MySQL
MySQLの日付(DATE)をHTML5の入力属性「week」に変換する時は「YEARWEEK」を使うべし
えだ
更新日:2021/08/11
どうも、僕です。
先日初めてMySQLデータベースの日付型をHTMLのweekに変換したいなんて需要が生まれました。
調べてみるとMySQLには「WEEK」と「YEARWEEK」という2種類の関数がありました。
(ちなみに「MariaDB 10.1.x」と「MySQL 5.6.x」にて検証しています)
HTML5の<input type=”week”>をMySQLのDATE型から表現する
うーん、急いでいる時に見るとやる気が失せますね。
「WEEK」と「YEARWEEK」を腰を据えて調べる
Xmasも過ぎた年末で気持ちに余裕があったのでじっくり挑みました。
HTMLのweekだと「2016年第1週」は「2016/01/04(月)~2016/01/10(日)」となっており、サーバ送信後は「2016-W01」としてデータが飛んでいます。
(PHP5.6とChrome55.0.xの組み合わせで確認)
そこでポイントはネックとなる跨ぎ日の2016/01/01(金)です。
答えから言うと「2015年第53週」で「2015/12/28(月)~2016/01/03(日)」となっており、サーバ送信後は「2015-W53」としてデータが飛びます。
つまりMySQLでこの挙動をする関数と引数を選択すればいいわけです。
で出した選択は「YEARWEEK」の引数「3」です。
1 |
YEARWEEK('2016-01-01',3) |
このままだと「201553」という結果が返ってしまうので、ちょっと加工します。
1 2 3 4 5 |
CONCAT( SUBSTR(YEARWEEK('2016-01-01',3),1,4) , '-W' , SUBSTR(YEARWEEK('2016-01-01',3),5) ) |
これはもうちょっと良い書き方があるかもですが、とにかく「2015-W53」が返ります。
調べても意外と乗ってなかったのでニッチなのでしょうが、テクってみたい時にお試しあれ。
ちなみにそれぞれの結果はこんな感じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
SELECT WEEK('2016-01-01',0) -- 0 , WEEK('2016-01-01',1) -- 0 , WEEK('2016-01-01',2) -- 52 , WEEK('2016-01-01',3) -- 53 , WEEK('2016-01-01',4) -- 0 , WEEK('2016-01-01',5) -- 0 , WEEK('2016-01-01',6) -- 52 , WEEK('2016-01-01',7) -- 52 , YEARWEEK('2016-01-01',0) -- 201552 , YEARWEEK('2016-01-01',1) -- 201553 , YEARWEEK('2016-01-01',2) -- 201552 , YEARWEEK('2016-01-01',3) -- 201553 , YEARWEEK('2016-01-01',4) -- 201552 , YEARWEEK('2016-01-01',5) -- 201552 , YEARWEEK('2016-01-01',6) -- 201552 , YEARWEEK('2016-01-01',7) -- 201552 , CONCAT( SUBSTR(YEARWEEK('2016-01-01',3),1,4) , '-W' , SUBSTR(YEARWEEK('2016-01-01',3),5) ) AS html5week |