DATEDIFFは日付を文字列的に比較しているだけ

## 結論

DATEDIFF関数は使わないほうがよい。WHERE句で頑張ろう。

## 環境とテストデータ

```sql
> show variables like '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | UTC    |
| time_zone        | SYSTEM |
+------------------+--------+
2 rows in set (0.014 sec)

> select id, name, start_at from hoges;
+----+--------------+---------------------+
| id | name         | start_at            |
+----+--------------+---------------------+
|  1 | yesterday 0  | 2024-10-21 00:00:00 |
|  2 | yesterday 1  | 2024-10-21 01:00:00 |
|  3 | yesterday 2  | 2024-10-21 02:00:00 |
|  4 | yesterday 3  | 2024-10-21 03:00:00 |
|  5 | yesterday 4  | 2024-10-21 04:00:00 |
|  6 | yesterday 5  | 2024-10-21 05:00:00 |
|  7 | yesterday 6  | 2024-10-21 06:00:00 |
|  8 | yesterday 7  | 2024-10-21 07:00:00 |
|  9 | yesterday 8  | 2024-10-21 08:00:00 |
| 10 | yesterday 9  | 2024-10-21 09:00:00 |
| 11 | yesterday 10 | 2024-10-21 10:00:00 |
| 12 | yesterday 11 | 2024-10-21 11:00:00 |
| 13 | yesterday 12 | 2024-10-21 12:00:00 |
| 14 | yesterday 13 | 2024-10-21 13:00:00 |
| 15 | yesterday 14 | 2024-10-21 14:00:00 |
| 16 | yesterday 15 | 2024-10-21 15:00:00 |
| 17 | yesterday 16 | 2024-10-21 16:00:00 |
| 18 | yesterday 17 | 2024-10-21 17:00:00 |
| 19 | yesterday 18 | 2024-10-21 18:00:00 |
| 20 | yesterday 19 | 2024-10-21 19:00:00 |
| 21 | yesterday 20 | 2024-10-21 20:00:00 |
| 22 | yesterday 21 | 2024-10-21 21:00:00 |
| 23 | yesterday 22 | 2024-10-21 22:00:00 |
| 24 | yesterday 23 | 2024-10-21 23:00:00 |
| 25 | today 0      | 2024-10-22 00:00:00 |
| 26 | today 1      | 2024-10-22 01:00:00 |
| 27 | today 2      | 2024-10-22 02:00:00 |
| 28 | today 3      | 2024-10-22 03:00:00 |
| 29 | today 4      | 2024-10-22 04:00:00 |
| 30 | today 5      | 2024-10-22 05:00:00 |
| 31 | today 6      | 2024-10-22 06:00:00 |
| 32 | today 7      | 2024-10-22 07:00:00 |
| 33 | today 8      | 2024-10-22 08:00:00 |
| 34 | today 9      | 2024-10-22 09:00:00 |
| 35 | today 10     | 2024-10-22 10:00:00 |
| 36 | today 11     | 2024-10-22 11:00:00 |
| 37 | today 12     | 2024-10-22 12:00:00 |
| 38 | today 13     | 2024-10-22 13:00:00 |
| 39 | today 14     | 2024-10-22 14:00:00 |
| 40 | today 15     | 2024-10-22 15:00:00 |
| 41 | today 16     | 2024-10-22 16:00:00 |
| 42 | today 17     | 2024-10-22 17:00:00 |
| 43 | today 18     | 2024-10-22 18:00:00 |
| 44 | today 19     | 2024-10-22 19:00:00 |
| 45 | today 20     | 2024-10-22 20:00:00 |
| 46 | today 21     | 2024-10-22 21:00:00 |
| 47 | today 22     | 2024-10-22 22:00:00 |
| 48 | today 23     | 2024-10-22 23:00:00 |
| 49 | tomorrow 0   | 2024-10-23 00:00:00 |
| 50 | tomorrow 1   | 2024-10-23 01:00:00 |
| 51 | tomorrow 2   | 2024-10-23 02:00:00 |
| 52 | tomorrow 3   | 2024-10-23 03:00:00 |
| 53 | tomorrow 4   | 2024-10-23 04:00:00 |
| 54 | tomorrow 5   | 2024-10-23 05:00:00 |
| 55 | tomorrow 6   | 2024-10-23 06:00:00 |
| 56 | tomorrow 7   | 2024-10-23 07:00:00 |
| 57 | tomorrow 8   | 2024-10-23 08:00:00 |
| 58 | tomorrow 9   | 2024-10-23 09:00:00 |
| 59 | tomorrow 10  | 2024-10-23 10:00:00 |
| 60 | tomorrow 11  | 2024-10-23 11:00:00 |
| 61 | tomorrow 12  | 2024-10-23 12:00:00 |
| 62 | tomorrow 13  | 2024-10-23 13:00:00 |
| 63 | tomorrow 14  | 2024-10-23 14:00:00 |
| 64 | tomorrow 15  | 2024-10-23 15:00:00 |
| 65 | tomorrow 16  | 2024-10-23 16:00:00 |
| 66 | tomorrow 17  | 2024-10-23 17:00:00 |
| 67 | tomorrow 18  | 2024-10-23 18:00:00 |
| 68 | tomorrow 19  | 2024-10-23 19:00:00 |
| 69 | tomorrow 20  | 2024-10-23 20:00:00 |
| 70 | tomorrow 21  | 2024-10-23 21:00:00 |
| 71 | tomorrow 22  | 2024-10-23 22:00:00 |
| 72 | tomorrow 23  | 2024-10-23 23:00:00 |
+----+--------------+---------------------+
72 rows in set (0.011 sec)
```

## DATEDIFF関数

実際に利用してみると`2024-10-22`という部分で一致検索されてしまっているような状態。
これではタイムゾーンを考慮した`今日`とは違ってしまう。

```sql
> select NOW();
+---------------------+------------+
| NOW()               | CURDATE()  |
+---------------------+------------+
| 2024-10-22 05:53:29 | 2024-10-22 |
+---------------------+------------+
1 row in set (0.002 sec)

> select id, name, start_at, DATEDIFF(CURDATE(), start_at) as DATEDIFF from hoges;
+----+--------------+---------------------+----------+
| id | name         | start_at            | DATEDIFF |
+----+--------------+---------------------+----------+
|  1 | yesterday 0  | 2024-10-21 00:00:00 |        1 |
|  2 | yesterday 1  | 2024-10-21 01:00:00 |        1 |
|  3 | yesterday 2  | 2024-10-21 02:00:00 |        1 |
|  4 | yesterday 3  | 2024-10-21 03:00:00 |        1 |
|  5 | yesterday 4  | 2024-10-21 04:00:00 |        1 |
|  6 | yesterday 5  | 2024-10-21 05:00:00 |        1 |
|  7 | yesterday 6  | 2024-10-21 06:00:00 |        1 |
|  8 | yesterday 7  | 2024-10-21 07:00:00 |        1 |
|  9 | yesterday 8  | 2024-10-21 08:00:00 |        1 |
| 10 | yesterday 9  | 2024-10-21 09:00:00 |        1 |
| 11 | yesterday 10 | 2024-10-21 10:00:00 |        1 |
| 12 | yesterday 11 | 2024-10-21 11:00:00 |        1 |
| 13 | yesterday 12 | 2024-10-21 12:00:00 |        1 |
| 14 | yesterday 13 | 2024-10-21 13:00:00 |        1 |
| 15 | yesterday 14 | 2024-10-21 14:00:00 |        1 |
| 16 | yesterday 15 | 2024-10-21 15:00:00 |        1 |
| 17 | yesterday 16 | 2024-10-21 16:00:00 |        1 |
| 18 | yesterday 17 | 2024-10-21 17:00:00 |        1 |
| 19 | yesterday 18 | 2024-10-21 18:00:00 |        1 |
| 20 | yesterday 19 | 2024-10-21 19:00:00 |        1 |
| 21 | yesterday 20 | 2024-10-21 20:00:00 |        1 |
| 22 | yesterday 21 | 2024-10-21 21:00:00 |        1 |
| 23 | yesterday 22 | 2024-10-21 22:00:00 |        1 |
| 24 | yesterday 23 | 2024-10-21 23:00:00 |        1 |
| 25 | today 0      | 2024-10-22 00:00:00 |        0 |
| 26 | today 1      | 2024-10-22 01:00:00 |        0 |
| 27 | today 2      | 2024-10-22 02:00:00 |        0 |
| 28 | today 3      | 2024-10-22 03:00:00 |        0 |
| 29 | today 4      | 2024-10-22 04:00:00 |        0 |
| 30 | today 5      | 2024-10-22 05:00:00 |        0 |
| 31 | today 6      | 2024-10-22 06:00:00 |        0 |
| 32 | today 7      | 2024-10-22 07:00:00 |        0 |
| 33 | today 8      | 2024-10-22 08:00:00 |        0 |
| 34 | today 9      | 2024-10-22 09:00:00 |        0 |
| 35 | today 10     | 2024-10-22 10:00:00 |        0 |
| 36 | today 11     | 2024-10-22 11:00:00 |        0 |
| 37 | today 12     | 2024-10-22 12:00:00 |        0 |
| 38 | today 13     | 2024-10-22 13:00:00 |        0 |
| 39 | today 14     | 2024-10-22 14:00:00 |        0 |
| 40 | today 15     | 2024-10-22 15:00:00 |        0 |
| 41 | today 16     | 2024-10-22 16:00:00 |        0 |
| 42 | today 17     | 2024-10-22 17:00:00 |        0 |
| 43 | today 18     | 2024-10-22 18:00:00 |        0 |
| 44 | today 19     | 2024-10-22 19:00:00 |        0 |
| 45 | today 20     | 2024-10-22 20:00:00 |        0 |
| 46 | today 21     | 2024-10-22 21:00:00 |        0 |
| 47 | today 22     | 2024-10-22 22:00:00 |        0 |
| 48 | today 23     | 2024-10-22 23:00:00 |        0 |
| 49 | tomorrow 0   | 2024-10-23 00:00:00 |       -1 |
| 50 | tomorrow 1   | 2024-10-23 01:00:00 |       -1 |
| 51 | tomorrow 2   | 2024-10-23 02:00:00 |       -1 |
| 52 | tomorrow 3   | 2024-10-23 03:00:00 |       -1 |
| 53 | tomorrow 4   | 2024-10-23 04:00:00 |       -1 |
| 54 | tomorrow 5   | 2024-10-23 05:00:00 |       -1 |
| 55 | tomorrow 6   | 2024-10-23 06:00:00 |       -1 |
| 56 | tomorrow 7   | 2024-10-23 07:00:00 |       -1 |
| 57 | tomorrow 8   | 2024-10-23 08:00:00 |       -1 |
| 58 | tomorrow 9   | 2024-10-23 09:00:00 |       -1 |
| 59 | tomorrow 10  | 2024-10-23 10:00:00 |       -1 |
| 60 | tomorrow 11  | 2024-10-23 11:00:00 |       -1 |
| 61 | tomorrow 12  | 2024-10-23 12:00:00 |       -1 |
| 62 | tomorrow 13  | 2024-10-23 13:00:00 |       -1 |
| 63 | tomorrow 14  | 2024-10-23 14:00:00 |       -1 |
| 64 | tomorrow 15  | 2024-10-23 15:00:00 |       -1 |
| 65 | tomorrow 16  | 2024-10-23 16:00:00 |       -1 |
| 66 | tomorrow 17  | 2024-10-23 17:00:00 |       -1 |
| 67 | tomorrow 18  | 2024-10-23 18:00:00 |       -1 |
| 68 | tomorrow 19  | 2024-10-23 19:00:00 |       -1 |
| 69 | tomorrow 20  | 2024-10-23 20:00:00 |       -1 |
| 70 | tomorrow 21  | 2024-10-23 21:00:00 |       -1 |
| 71 | tomorrow 22  | 2024-10-23 22:00:00 |       -1 |
| 72 | tomorrow 23  | 2024-10-23 23:00:00 |       -1 |
+----+--------------+---------------------+----------+
72 rows in set (0.006 sec)
```

## CONVERT_TZ関数

正解は+09:00されたら今日であるレコードなのでid=16〜39のレコードが該当してほしい。

今度はCZDIFFカラムに正しい差分がとれた。

```sql
> select
    ->     id,
    ->     name,
    ->     start_at,
    ->     DATEDIFF(CURDATE(), start_at) as DATEDIFF,
    ->     CONVERT_TZ(start_at, "+00:00", "+09:00") as CZ,
    ->     DATEDIFF(CURDATE(), CONVERT_TZ(start_at, "+00:00", "+09:00")) as CZDIFF from hoges;
+----+--------------+---------------------+----------+---------------------+--------+
| id | name         | start_at            | DATEDIFF | CZ                  | CZDIFF |
+----+--------------+---------------------+----------+---------------------+--------+
|  1 | yesterday 0  | 2024-10-21 00:00:00 |        1 | 2024-10-21 09:00:00 |      1 |
|  2 | yesterday 1  | 2024-10-21 01:00:00 |        1 | 2024-10-21 10:00:00 |      1 |
|  3 | yesterday 2  | 2024-10-21 02:00:00 |        1 | 2024-10-21 11:00:00 |      1 |
|  4 | yesterday 3  | 2024-10-21 03:00:00 |        1 | 2024-10-21 12:00:00 |      1 |
|  5 | yesterday 4  | 2024-10-21 04:00:00 |        1 | 2024-10-21 13:00:00 |      1 |
|  6 | yesterday 5  | 2024-10-21 05:00:00 |        1 | 2024-10-21 14:00:00 |      1 |
|  7 | yesterday 6  | 2024-10-21 06:00:00 |        1 | 2024-10-21 15:00:00 |      1 |
|  8 | yesterday 7  | 2024-10-21 07:00:00 |        1 | 2024-10-21 16:00:00 |      1 |
|  9 | yesterday 8  | 2024-10-21 08:00:00 |        1 | 2024-10-21 17:00:00 |      1 |
| 10 | yesterday 9  | 2024-10-21 09:00:00 |        1 | 2024-10-21 18:00:00 |      1 |
| 11 | yesterday 10 | 2024-10-21 10:00:00 |        1 | 2024-10-21 19:00:00 |      1 |
| 12 | yesterday 11 | 2024-10-21 11:00:00 |        1 | 2024-10-21 20:00:00 |      1 |
| 13 | yesterday 12 | 2024-10-21 12:00:00 |        1 | 2024-10-21 21:00:00 |      1 |
| 14 | yesterday 13 | 2024-10-21 13:00:00 |        1 | 2024-10-21 22:00:00 |      1 |
| 15 | yesterday 14 | 2024-10-21 14:00:00 |        1 | 2024-10-21 23:00:00 |      1 |
| 16 | yesterday 15 | 2024-10-21 15:00:00 |        1 | 2024-10-22 00:00:00 |      0 |
| 17 | yesterday 16 | 2024-10-21 16:00:00 |        1 | 2024-10-22 01:00:00 |      0 |
| 18 | yesterday 17 | 2024-10-21 17:00:00 |        1 | 2024-10-22 02:00:00 |      0 |
| 19 | yesterday 18 | 2024-10-21 18:00:00 |        1 | 2024-10-22 03:00:00 |      0 |
| 20 | yesterday 19 | 2024-10-21 19:00:00 |        1 | 2024-10-22 04:00:00 |      0 |
| 21 | yesterday 20 | 2024-10-21 20:00:00 |        1 | 2024-10-22 05:00:00 |      0 |
| 22 | yesterday 21 | 2024-10-21 21:00:00 |        1 | 2024-10-22 06:00:00 |      0 |
| 23 | yesterday 22 | 2024-10-21 22:00:00 |        1 | 2024-10-22 07:00:00 |      0 |
| 24 | yesterday 23 | 2024-10-21 23:00:00 |        1 | 2024-10-22 08:00:00 |      0 |
| 25 | today 0      | 2024-10-22 00:00:00 |        0 | 2024-10-22 09:00:00 |      0 |
| 26 | today 1      | 2024-10-22 01:00:00 |        0 | 2024-10-22 10:00:00 |      0 |
| 27 | today 2      | 2024-10-22 02:00:00 |        0 | 2024-10-22 11:00:00 |      0 |
| 28 | today 3      | 2024-10-22 03:00:00 |        0 | 2024-10-22 12:00:00 |      0 |
| 29 | today 4      | 2024-10-22 04:00:00 |        0 | 2024-10-22 13:00:00 |      0 |
| 30 | today 5      | 2024-10-22 05:00:00 |        0 | 2024-10-22 14:00:00 |      0 |
| 31 | today 6      | 2024-10-22 06:00:00 |        0 | 2024-10-22 15:00:00 |      0 |
| 32 | today 7      | 2024-10-22 07:00:00 |        0 | 2024-10-22 16:00:00 |      0 |
| 33 | today 8      | 2024-10-22 08:00:00 |        0 | 2024-10-22 17:00:00 |      0 |
| 34 | today 9      | 2024-10-22 09:00:00 |        0 | 2024-10-22 18:00:00 |      0 |
| 35 | today 10     | 2024-10-22 10:00:00 |        0 | 2024-10-22 19:00:00 |      0 |
| 36 | today 11     | 2024-10-22 11:00:00 |        0 | 2024-10-22 20:00:00 |      0 |
| 37 | today 12     | 2024-10-22 12:00:00 |        0 | 2024-10-22 21:00:00 |      0 |
| 38 | today 13     | 2024-10-22 13:00:00 |        0 | 2024-10-22 22:00:00 |      0 |
| 39 | today 14     | 2024-10-22 14:00:00 |        0 | 2024-10-22 23:00:00 |      0 |
| 40 | today 15     | 2024-10-22 15:00:00 |        0 | 2024-10-23 00:00:00 |     -1 |
| 41 | today 16     | 2024-10-22 16:00:00 |        0 | 2024-10-23 01:00:00 |     -1 |
| 42 | today 17     | 2024-10-22 17:00:00 |        0 | 2024-10-23 02:00:00 |     -1 |
| 43 | today 18     | 2024-10-22 18:00:00 |        0 | 2024-10-23 03:00:00 |     -1 |
| 44 | today 19     | 2024-10-22 19:00:00 |        0 | 2024-10-23 04:00:00 |     -1 |
| 45 | today 20     | 2024-10-22 20:00:00 |        0 | 2024-10-23 05:00:00 |     -1 |
| 46 | today 21     | 2024-10-22 21:00:00 |        0 | 2024-10-23 06:00:00 |     -1 |
| 47 | today 22     | 2024-10-22 22:00:00 |        0 | 2024-10-23 07:00:00 |     -1 |
| 48 | today 23     | 2024-10-22 23:00:00 |        0 | 2024-10-23 08:00:00 |     -1 |
| 49 | tomorrow 0   | 2024-10-23 00:00:00 |       -1 | 2024-10-23 09:00:00 |     -1 |
| 50 | tomorrow 1   | 2024-10-23 01:00:00 |       -1 | 2024-10-23 10:00:00 |     -1 |
| 51 | tomorrow 2   | 2024-10-23 02:00:00 |       -1 | 2024-10-23 11:00:00 |     -1 |
| 52 | tomorrow 3   | 2024-10-23 03:00:00 |       -1 | 2024-10-23 12:00:00 |     -1 |
| 53 | tomorrow 4   | 2024-10-23 04:00:00 |       -1 | 2024-10-23 13:00:00 |     -1 |
| 54 | tomorrow 5   | 2024-10-23 05:00:00 |       -1 | 2024-10-23 14:00:00 |     -1 |
| 55 | tomorrow 6   | 2024-10-23 06:00:00 |       -1 | 2024-10-23 15:00:00 |     -1 |
| 56 | tomorrow 7   | 2024-10-23 07:00:00 |       -1 | 2024-10-23 16:00:00 |     -1 |
| 57 | tomorrow 8   | 2024-10-23 08:00:00 |       -1 | 2024-10-23 17:00:00 |     -1 |
| 58 | tomorrow 9   | 2024-10-23 09:00:00 |       -1 | 2024-10-23 18:00:00 |     -1 |
| 59 | tomorrow 10  | 2024-10-23 10:00:00 |       -1 | 2024-10-23 19:00:00 |     -1 |
| 60 | tomorrow 11  | 2024-10-23 11:00:00 |       -1 | 2024-10-23 20:00:00 |     -1 |
| 61 | tomorrow 12  | 2024-10-23 12:00:00 |       -1 | 2024-10-23 21:00:00 |     -1 |
| 62 | tomorrow 13  | 2024-10-23 13:00:00 |       -1 | 2024-10-23 22:00:00 |     -1 |
| 63 | tomorrow 14  | 2024-10-23 14:00:00 |       -1 | 2024-10-23 23:00:00 |     -1 |
| 64 | tomorrow 15  | 2024-10-23 15:00:00 |       -1 | 2024-10-24 00:00:00 |     -2 |
| 65 | tomorrow 16  | 2024-10-23 16:00:00 |       -1 | 2024-10-24 01:00:00 |     -2 |
| 66 | tomorrow 17  | 2024-10-23 17:00:00 |       -1 | 2024-10-24 02:00:00 |     -2 |
| 67 | tomorrow 18  | 2024-10-23 18:00:00 |       -1 | 2024-10-24 03:00:00 |     -2 |
| 68 | tomorrow 19  | 2024-10-23 19:00:00 |       -1 | 2024-10-24 04:00:00 |     -2 |
| 69 | tomorrow 20  | 2024-10-23 20:00:00 |       -1 | 2024-10-24 05:00:00 |     -2 |
| 70 | tomorrow 21  | 2024-10-23 21:00:00 |       -1 | 2024-10-24 06:00:00 |     -2 |
| 71 | tomorrow 22  | 2024-10-23 22:00:00 |       -1 | 2024-10-24 07:00:00 |     -2 |
| 72 | tomorrow 23  | 2024-10-23 23:00:00 |       -1 | 2024-10-24 08:00:00 |     -2 |
+----+--------------+---------------------+----------+---------------------+--------+
72 rows in set (0.008 sec)
```

## 結果どうすればいいか

SQLで頑張るならば、CONVERT_TZをつかったSQLにしておいたほうがよい。

プログラムから呼ぶことができるならば検索条件に日付でFrom, Toを指定したほうがよい。

```ruby
# ActiveRecordの例
[5] pry(main)> Hoge.where(start_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
=>   Hoge Load (2.3ms)  SELECT `hoges`.* FROM `hoges` WHERE `hoges`.`start_at` BETWEEN '2024-10-21 15:00:00' AND '2024-10-22 14:59:59'
[#<Hoge:0x0000aaaae9164948 id: 16, name: "yesterday 15", start_at: Tue, 22 Oct 2024 00:00:00.000000000 JST +09:00>,
 #<Hoge:0x0000aaaae91647b8 id: 17, name: "yesterday 16", start_at: Tue, 22 Oct 2024 01:00:00.000000000 JST +09:00>,
 #<Hoge:0x0000aaaae9164650 id: 18, name: "yesterday 17", start_at: Tue, 22 Oct 2024 02:00:00.000000000 JST +09:00>,
 #<Hoge:0x0000aaaae91644e8 id: 19, name: "yesterday 18", start_at: Tue, 22 Oct 2024 03:00:00.000000000 JST +09:00>,
 #<Hoge:0x0000aaaae9164330 id: 20, name: "yesterday 19", start_at: Tue, 22 Oct 2024 04:00:00.000000000 JST +09:00>,
 #<Hoge:0x0000aaaae9164178 id: 21, name: "yesterday 20", start_at: Tue, 22 Oct 2024 05:00:00.000000000 JST +09:00>,
 #<Hoge:0x0000aaaae915ff88 id: 22, name: "yesterday 21", start_at: Tue, 22 Oct 2024 06:00:00.000000000 JST +09:00>,
 #<Hoge:0x0000aaaae915fe48 id: 23, name: "yesterday 22", start_at: Tue, 22 Oct 2024 07:00:00.000000000 JST +09:00>,
 #<Hoge:0x0000aaaae915fa60 id: 24, name: "yesterday 23", start_at: Tue, 22 Oct 2024 08:00:00.000000000 JST +09:00>,
 #<Hoge:0x0000aaaae915f808 id: 25, name: "today 0", start_at: Tue, 22 Oct 2024 09:00:00.000000000 JST +09:00>,
 #<Hoge:0x0000aaaae915f3a8 id: 26, name: "today 1", start_at: Tue, 22 Oct 2024 10:00:00.000000000 JST +09:00>,
 #<Hoge:0x0000aaaae915ef20 id: 27, name: "today 2", start_at: Tue, 22 Oct 2024 11:00:00.000000000 JST +09:00>,
 #<Hoge:0x0000aaaae915ed40 id: 28, name: "today 3", start_at: Tue, 22 Oct 2024 12:00:00.000000000 JST +09:00>,
 #<Hoge:0x0000aaaae915ea70 id: 29, name: "today 4", start_at: Tue, 22 Oct 2024 13:00:00.000000000 JST +09:00>,
 #<Hoge:0x0000aaaae915e430 id: 30, name: "today 5", start_at: Tue, 22 Oct 2024 14:00:00.000000000 JST +09:00>,
 #<Hoge:0x0000aaaae915e2a0 id: 31, name: "today 6", start_at: Tue, 22 Oct 2024 15:00:00.000000000 JST +09:00>,
 #<Hoge:0x0000aaaae915e138 id: 32, name: "today 7", start_at: Tue, 22 Oct 2024 16:00:00.000000000 JST +09:00>,
 #<Hoge:0x0000aaaae915df08 id: 33, name: "today 8", start_at: Tue, 22 Oct 2024 17:00:00.000000000 JST +09:00>,
 #<Hoge:0x0000aaaae915dd50 id: 34, name: "today 9", start_at: Tue, 22 Oct 2024 18:00:00.000000000 JST +09:00>,
 #<Hoge:0x0000aaaae915dbe8 id: 35, name: "today 10", start_at: Tue, 22 Oct 2024 19:00:00.000000000 JST +09:00>,
 #<Hoge:0x0000aaaae915da08 id: 36, name: "today 11", start_at: Tue, 22 Oct 2024 20:00:00.000000000 JST +09:00>,
 #<Hoge:0x0000aaaae915d8a0 id: 37, name: "today 12", start_at: Tue, 22 Oct 2024 21:00:00.000000000 JST +09:00>,
 #<Hoge:0x0000aaaae915d5f8 id: 38, name: "today 13", start_at: Tue, 22 Oct 2024 22:00:00.000000000 JST +09:00>,
 #<Hoge:0x0000aaaae915d350 id: 39, name: "today 14", start_at: Tue, 22 Oct 2024 23:00:00.000000000 JST +09:00>]
[6] pry(main)>
```

## やってはいけない

こっちが本題というかきっかけなのですが、ransackでこれやってしまうと上手くいきません。

```sql
class Hoge < ApplicationRecord
  ransacker :start_at_date_diff, type: :integer do
    Arel.sql("DATEDIFF(NOW(), start_at)")
  end
  def self.ransackable_attributes(auth_object = nil)
    ["start_at", "start_at_date_diff"]
  end
end

# これだと上にあるようなタイムゾーン問題が！
Hoge.ransack(start_at_date_diff_gteq: 1).result.to_sql
=> "SELECT `hoges`.* FROM `hoges` WHERE DATEDIFF(NOW(), start_at) >= 1"

# 日付範囲を指定したほうがいい
now = Time.current
Hoge.ransack(start_at_lt: now.end_of_day, start_at_gteq: (now - 1.day).beginning_of_day).result.to_sql
=> "SELECT `hoges`.* FROM `hoges` WHERE (`hoges`.`start_at` < '2024-10-22 14:59:59' AND `hoges`.`start_at` >= '2024-10-20 15:00:00')"
```