mysqlで25時を表現できないか考えてみた、結果できた

Author:

やっぱり人間、寝るまでが今日、という感じじゃないですか。
日付が変わっても明日もあるから、とか言っちゃうじゃないですか。
そんなわけで一部の業界では深夜1時を25時とか、深夜3時を27時とか言いますよね。
これdatabaseでできないかな、と思いまして、色々考えてみました。

datetimeに時間を足しちゃだめ

当たり前ですが、datetime属性にadd_timeなんかしても25時にはなりません。
select addtime(‘2018-08-01 23:00:00′, ’01:00:00’) time;
これの結果は2018-08-02 00:00:00です。
つまり、時刻だけ数値で計算してconcatでくっつければいい、と。

case whenで判定、date_addで計算

27時までという比較はcase whenとdate_formatでできそうですね。
時が3時より前なら+24すればOK、と。
んで日付は-1する必要あって、1日より前は31日する。
date_addを使えば良さそう。

結果

というわけで、これを計算してみましょう。

+----+---------------------+
| id | created             |
+----+---------------------+
|  1 | 2018-08-01 01:00:00 |
+----+---------------------+

クエリはこれでいいのかな。

select 
case when date_format(created, '%H') < 3 then 
    concat(
        date_format(date_sub(created, interval 1 day), '%Y-%m-%d '), 
        date_format(created, '%H')+24, 
        date_format(created, ':%i:%s')
    ) 
else 
    created 
end as created 
from sample;

で、結果は。

+---------------------+
| created             |
+---------------------+
| 2018-07-31 25:00:00 |
+---------------------+

おおーできたー。

まとめ

もちろん毎回こんなん書いてられないからサーバー側のプログラムで書いてvarcharなりのカラムにぶちこんだほうがいいですね。
が、これ日付だけばらしたカラムにしておけば日付またいでも「今日の更新」とか「7月の更新」とかにも使える。
ブログとかで毎日更新、というルールを決めている場合良いかもしれないですよ。

Facebook にシェア
Pocket