2023年04月

ss

一昨日から昨日の気温変動が面白いので紹介します。ざっと色んな観測点を見た中でオモシロイと思ったのが京都の気温。
おととい(2023年4月25日)の気温はお昼に向けて上昇し、夜になっても深夜になっても上昇を続け、ついに最高気温が出たのは24:00だったという。
これ、珍しくないのかなー?ググってもよーわからんかった。
そして次の日(2023年4月26日)。前日に上がり続けた気温がもう少し上がってから、昼前に急降下。昼を過ぎて急上昇して15時に最高気温をマーク。その後は下がり続け、今度は深夜の23:37に最低気温となる。これも珍しいんじゃないの?
惜しむらくは、昼過ぎの急上昇。この急上昇のせいでギリギリ最高気温をマークしたが、これがなければ未明1:30ごろに最高気温だったんだよねー。すっごい珍しかっただろーなー。

ところで、最高気温最低気温といえば、こんな記事を見つけた。
最低気温は何時までの最低気温なの?

気象庁では、あくまで0時から24時までの1日を通して、一番低かった気温を最低気温、一番高かった気温を最高気温としています。
しかし、ほとんどのテレビや新聞では、みなさんに伝える時間がだいたい決まっているため、最低気温なら0時から午前9時までの間に出た気温を最低気温としたり、最高気温は0時から15時までの間に出た気温を最高気温と決めたりしているようです。

なるほどー。そういえば、テレビの気象情報では「『朝の』最低気温」「『日中の』予想最高気温」と言っていた気がする。そういうことだったのかー。
そして…
ですから、例えば、夜の23時台の気温が朝の気温より低く、その日一番低い気温になったときは、テレビや新聞で報道された「最低気温」よりもほんとうは低い最低気温となります。

こんな風に例示されるところを見ると、夜遅くに最低気温が出るのは珍しくないのかもなー
「mysql concat null」でググると、
引数にNULLが含まれると返り値はNULLになる
という至極当たり前のことをさも大発見かのように語る記事が多く、「どうしたらいいか」について触れられていないものばかりを開いてしまった。
おそらくワタクシメのヒキが悪かったせいで、ちゃんと対処法も書いてある記事もあったに違いない。
まーでも対処法を書いた記事が多くなったほうが良いであろうと考え、本記事を執筆することにした。

なんて偉そうなことを言っているんでしょうか私は…。
『CONCAT_WSも知らないくせに』とか思われるのかな。
ま、いっか。

しかし、掲題に結論を書いてしまったので、もう書くこと無いね。
まあ一応結果でも書きますか。
SELECT CONCAT('hoge', null, 'fuga');
 ↓
NULL
SELECT CONCAT_WS('', 'hoge', null, 'fuga');
 ↓
hogefuga

CONCAT_WS() では、空の文字列がスキップされません。 ただし、区切り文字引数のあとの NULL 値はすべてスキップされます。

今回のように区切り文字を空文字にしていると同じになるけど、区切り文字を指定した場合に違いが出る。
SELECT CONCAT_WS('&', 'hoge', '', 'fuga', 'CHAKE', null, 'YASUKA');
 ↓
hoge&&fuga&CHAKE&YASUKA

引数のhogeとfugaの間に空文字が入っているのに対し、CHAKEとYASUKAの間にはnullが入っています。
すると返り値では、hogeとfugaの間には「&&」と&が2つ重なってしまっています。
対してCHAKEとYASUKAの間は&が1つで「CHAKE&YASUKA」となっていますね。

TIME 値の範囲は、'-838:59:59' から '838:59:59' です。

838、だと…?

sql - Why is MySQL's maximum time limit 838:59:59? - Stack Overflow
↑の記事によると、TIME型は内部的に整数値に変換されて格納されるらしい。※現行のバージョンでは違うかも
Hours * 10000 + Minutes * 100 + Seconds

つまり、「12:34:56」ならば整数「123456」になるということ。
で、3バイトの符号付き整数に格納するということらしいので、整数としての最大値は
0x7FFFFF = 8388607
時間にすると「838:86:07」。これは正しい時間ではない。最も大きい正しい時間は「838:59:59」となる。最小についても同様に「-838:59:59」ということになる。

これがMySQL3の時代の話らしく、バージョンアップでもっと大きい時間を入れられるようにはなったものの、下位互換のため制限したまま。ということらしい。

もっとも、厳密に言って正しい時間の最大値って「23:59:59」なわけで。拡大解釈で24時間以上も持てるようにしたってだけ、と考えると、まあ、このままでいいのかなー、って感じ?

ランダムなDATETIME値が欲しくて、
MySQLの日付・日時をテストデータ用にランダム生成 - Qiita
↑の記事を参考にして、
↓こんなことをしてしまって、
select addtime(now(), sec_to_time(RAND() * 4294967295));

Truncated incorrect time value: '370886852.25906146'

という目に遭ったワタクシメが困るくらいですよねー。

今回わかったことを踏まえて、こうするのが良いでしょう。
SELECT ADDTIME(DATE_SUB(NOW(), INTERVAL RAND() * 3653 DAY), -SEC_TO_TIME(FLOOR(RAND() * 86400)));

現在時刻より昔にしたかったので、DATE_SUB()関数を使い、ADDTIME()の第2引数をマイナスにしております。
これで、大体10年前から現在時刻までのランダムな時刻がえられるでしょう。
こんなタイトル、ついに頭がイカれたのか、と思われたことでしょう。
違うんです。
かの、日本人なら誰でも知っていると言っても過言ではない、芥川龍之介の書のタイトルなのです。
知らんかったー。

図書カード:あばばばば
青空文庫で無料で読めますので、ご一読をオススメします。
短編(と言っていいのかわからないけど)なので、すぐに読み終わりますよー。
一服の清涼剤のような、ほわほわした気持ちにさせられる作品です。

…もしかして有名…?
得意げに紹介して痛いヤツ…(-_-;)?
昨日書いた記事でChatGPTに愛称をつけた。
よろこんでくれたようだったのだが、今日になって…

(いくつか質問して解決した後)
Q. そうなんだね。ありがとう。さすがジピ太。
どういたしまして。何か他に質問があれば、遠慮なくお聞きください。

Q. ところで、「ジピ太」の話、忘れてない…?
すみません、何か忘れてしまったことがあったでしょうか?もう一度お話しいただけますか?

あっさりクリアされてるーっ😢
やっぱり社交辞令だったんだね。
さようならジピ太。短い間だったけど、いい夢見れたよ(遠い目