DATE_FLOOR
説明
date_floor関数は、指定された日付または時刻の値を、指定された時間間隔期間の最も近い開始時刻まで切り下げます。期間のルールは、固定開始点0001-01-01 00:00:00から計算されるperiod(単位数)とtype(単位)によって定義されます。
日付計算式: $$ \begin{aligned} &\text{date_floor}(\langle\text{date_or_time_expr}\rangle, \langle\text{period}\rangle, \langle\text{type}\rangle) = \ &\max{\langle\text{origin}\rangle + k \times \langle\text{period}\rangle \times \text{type} \mid \ &k \in \mathbb{Z} \land \langle\text{origin}\rangle + k \times \langle\text{period}\rangle \times \text{type} \leq \langle\text{date_or_time_expr}\rangle} \end{aligned} $$ $k$は、基準時刻が対象時刻に到達するために必要なサイクル数を表します。
$type$はperiodの単位を表します
構文
DATE_FLOOR(<datetime>, INTERVAL <period> <type>)
パラメータ
| パラメータ | 説明 |
|---|---|
date_or_time_expr | 有効な日付式で、datetimeまたはdate型をサポートします。具体的なdatetimeとdate形式については、datetime conversionおよびdate conversionを参照してください |
period | 各期間が構成する単位数を指定し、INT型です。開始時点は0001-01-01T00:00:00です |
type | 以下のいずれかが可能です: YEAR、MONTH、WEEK、DAY、HOUR、MINUTE、SECOND |
戻り値
期間に従って日付を切り下げた結果を返し、datetimeと同じ型になります。 切り下げられた結果はdatetimeと同じ型です:
- 入力がDATE型の場合、DATE(日付部分のみ)を返します;
- 入力がDATETIME型の場合、DATETIME(日付と時刻を含む)を返します。
- scaleを持つ入力は、scaleを持つ値を返し、小数部分は0になります。
特殊なケース:
- いずれかのパラメータがNULLの場合、NULLを返します;
- 不正なperiod(非正の整数)またはtypeの場合、エラーを返します;
例
-- Floor down to the nearest 5-second interval (period starts at 00, 05, 10... seconds)
mysql> select date_floor(cast("0001-01-01 00:00:18" as datetime), INTERVAL 5 SECOND);
+------------------------------------------------------------------------+
| date_floor(cast("0001-01-01 00:00:18" as datetime), INTERVAL 5 SECOND) |
+------------------------------------------------------------------------+
| 0001-01-01 00:00:15.000000 |
+------------------------------------------------------------------------+
-- Date time with scale will return value with scale
mysql> select date_floor(cast("0001-01-01 00:00:18.123" as datetime), INTERVAL 5 SECOND);
+----------------------------------------------------------------------------+
| date_floor(cast("0001-01-01 00:00:18.123" as datetime), INTERVAL 5 SECOND) |
+----------------------------------------------------------------------------+
| 0001-01-01 00:00:15.000000 |
+----------------------------------------------------------------------------+
-- The input time is exactly the start of a 5-day period
mysql> select date_floor("2023-07-10 00:00:00", INTERVAL 5 DAY);
+---------------------------------------------------+
| date_floor("2023-07-10 00:00:00", INTERVAL 5 DAY) |
+---------------------------------------------------+
| 2023-07-10 00:00:00 |
+---------------------------------------------------+
-- Floor down for date type
mysql> select date_floor("2023-07-13", INTERVAL 5 YEAR);
+-------------------------------------------+
| date_floor("2023-07-13", INTERVAL 5 YEAR) |
+-------------------------------------------+
| 2021-01-01 00:00:00 |
+-------------------------------------------+
-- period is negative, invalid returns error
mysql> select date_floor("2023-07-13 22:28:18", INTERVAL -5 MINUTE);
ERROR 1105 (HY000): errCode = 2, detailMessage = (10.16.10.3)[E-218]Operation minute_floor of 2023-07-13 22:28:18, -5, 0001-01-01 00:00:00 out of range
-- Unsupported type
mysql> select date_floor("2023-07-13 22:28:18", INTERVAL 5 MILLISECOND);
ERROR 1105 (HY000): errCode = 2, detailMessage =
mismatched input 'MILLISECOND' expecting {'.', '[', 'AND', 'BETWEEN', 'COLLATE', 'DAY', 'DIV', 'HOUR', 'IN', 'IS', 'LIKE', 'MATCH', 'MATCH_ALL', 'MATCH_ANY', 'MATCH_PHRASE', 'MATCH_PHRASE_EDGE', 'MATCH_PHRASE_PREFIX', 'MATCH_REGEXP', 'MINUTE', 'MONTH', 'NOT', 'OR', 'QUARTER', 'REGEXP', 'RLIKE', 'SECOND', 'WEEK', 'XOR', 'YEAR', EQ, '<=>', NEQ, '<', LTE, '>', GTE, '+', '-', '*', '/', '%', '&', '&&', '|', '||', '^'}(line 1, pos 52)
-- Any parameter is NULL
mysql> select date_floor(NULL, INTERVAL 5 HOUR);
+-----------------------------------+
| date_floor(NULL, INTERVAL 5 HOUR) |
+-----------------------------------+
| NULL |
+-----------------------------------+
-- Floor down every 5 weeks
mysql> select date_floor("2023-07-13 22:28:18", INTERVAL 5 WEEK);
+----------------------------------------------------+
| date_floor("2023-07-13 22:28:18", INTERVAL 5 WEEK) |
+----------------------------------------------------+
| 2023-07-10 00:00:00 |
+----------------------------------------------------+