やっぱり人間、寝るまでが今日、という感じじゃないですか。
日付が変わっても明日もあるから、とか言っちゃうじゃないですか。
そんなわけで一部の業界では深夜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月の更新」とかにも使える。
ブログとかで毎日更新、というルールを決めている場合良いかもしれないですよ。