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