LoginSignup
4
0

閏年じゃない年も2月29日生まれの人をお祝いする

Last updated at Posted at 2020-12-15

これはSOUSEI Technology アドベントカレンダー2020 15日目の記事です。

2/28と3/1どちらで祝うべきなのか

2/29生まれの人、閏年なら当日お祝いしてあげればいいのですが、閏年じゃないときはどうすればいいの?
ググってみました。

例年については、男女共に「2月28に祝う」という声が圧倒的。
https://cocoloni.jp/love/232234/

あとで祝われると「忘れてたでしょ?」ってなりそう
https://teratail.com/questions/145109

ということで2/28にお祝いします!🎉🎂
あとはデータを取得するだけ!

今日が誕生日の人を取得する

当日が2/28かつ閏年でないときに、追加で2/29のデータを取得してあげればOK!

$today = Carbon::now()->toDateString();
$users = User::whereDay('birthday', date('d', strtotime($today)))
    ->whereMonth('birthday', date('m', strtotime($today)))
    ->get();
if(date('m-d', strtotime($today)) == '02-28' && !date('L', strtotime($today))) {
    $users->merge(
        User::whereDay('birthday', 29)
        ->whereMonth('birthday', 2)
        ->get();
    );
}
return $users;

範囲指定(from〜to)で誕生日の人を取得する

これは指定された日付が閏年かどうか気にする必要はなく、toが2/28のときだけ考慮すればOK!

/**
 * 月日が日付範囲に含まれるスコープ
 *
 * @param Builder $query クエリ
 * @param string $column 対象カラム
 * @param Carbon $from 開始日
 * @param Carbon $to 終了日
 * @return Builder
 */
private function scopeWhereBetweenMonthAndDays($query, $column, $from, $to)
{
    // fromとtoの差が1年以上あるときはすべての日が対象になるのでクエリ追加不要(全データ取得する)
    if (!$to->diffInYears($from)) {
        $from_without_year = $from->format('m-d');
        // 閏年対応。2/28が指定された場合は2/29として、2/29のデータも取得対象とする
        $to_without_year = $to->format('m-d') == '02-28' ? '02-29' : $to->format('m-d');

        if ($from->year == $to->year) {
            $query = $query->whereRaw('DATE_FORMAT(' . $column . ',"%m-%d") >= "' . $from_without_year . '"')
                ->whereRaw('DATE_FORMAT(' . $column . ',"%m-%d") <= "' . $to_without_year . '"');
        } else {
            $query = $query->where(function ($q1) use ($from_without_year, $to_without_year) {
                $q1->orWhereRaw('DATE_FORMAT(' . $column . ',"%m-%d") >= "' . $from_without_year . '"')
                    ->orWhereRaw('DATE_FORMAT(' . $column . ',"%m-%d") <= "' . $to_without_year . '"');
            });
        }
    }
    return $query;
}

さいごに

僕の誕生日は3/3です!
プレゼント待ってます!

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0