に最終更新
DATE_TRUNC
説明
DATE_TRUNC 関数は、DATE、DATETIME、TIMESTAMP_NS、または TIMESTAMPTZ の値(datetime)を、指定した時間単位(time_unit)で切り捨てます。指定した単位以上の日時情報を保持し、それより細かい単位の日時情報を最小値にリセットします。たとえば「hour」単位で切り捨てると、年、月、日、時は保持され、分、秒などはゼロになります。年単位で切り捨てると、結果は xxxx-01-01 になります。
構文
DATE_TRUNC(<datetime>, <time_unit>)
DATE_TRUNC(<time_unit>, <datetime>)
パラメータ
| パラメータ | 説明 |
|---|---|
<datetime> | 有効な日付式。DATE、DATETIME、TIMESTAMP_NS、TIMESTAMPTZ をサポートします。具体的な形式については、TIMESTAMPTZ の変換、DATETIME の変換、DATE の変換を参照してください。 |
<time_unit> | 切り捨てる時間単位。指定できる値は [second,minute,hour,day,week,month,quarter,year] です。時間単位には文字列定数を指定する必要があり、列や定数以外の式は指定できません。 |
戻り値
TIMESTAMP_NS を入力した場合、戻り値は小数秒が常に九桁の TIMESTAMP_NS です。結果は戻り値の型の範囲内かどうか検証されます。TIMESTAMP_NS の範囲は [1677-09-21 00:12:43.145224192, 2262-04-11 23:47:16.854775807] です。
切り捨てた結果を datetime と同じ型で返します:
- 入力が DATE の場合、DATE を返します。
- 入力が DATETIME または時刻を含む文字列の場合、DATETIME(日付と切り捨て後の時刻を含む)を返します。
- 入力が TIMESTAMP_NS の場合、小数秒が九桁の TIMESTAMP_NS を返します。
- 入力が TIMESTAMPTZ 型の場合、まず local_time に変換してから切り捨てます。たとえば、セッション変数が
+08:00の場合、2025-12-31 23:59:59+05:00が表す local_time は2026-01-01 02:59:59です。 - scale を持つ日時型の場合、小数部はゼロに切り捨てられますが、戻り値の scale は維持されます。
特殊な場合:
- いずれかのパラメータが NULL の場合、NULL を返します。
- time_unit がサポートされていない場合、エラーを返します。
例
-- Truncate by second, minute, hour, day, week, month, quarter, year
mysql> select date_trunc(cast('2010-12-02 19:28:30' as datetime), 'second');
+---------------------------------------------------------------+
| date_trunc(cast('2010-12-02 19:28:30' as datetime), 'second') |
+---------------------------------------------------------------+
| 2010-12-02 19:28:30 |
+---------------------------------------------------------------+
select date_trunc('2010-12-02 19:28:30', 'minute');
+-------------------------------------------------+
| date_trunc('2010-12-02 19:28:30', 'minute') |
+-------------------------------------------------+
| 2010-12-02 19:28:00 |
+-------------------------------------------------+
select date_trunc('2010-12-02 19:28:30', 'hour');
+-------------------------------------------------+
| date_trunc('2010-12-02 19:28:30', 'hour') |
+-------------------------------------------------+
| 2010-12-02 19:00:00 |
+-------------------------------------------------+
select date_trunc('2010-12-02 19:28:30', 'day');
+-------------------------------------------------+
| date_trunc('2010-12-02 19:28:30', 'day') |
+-------------------------------------------------+
| 2010-12-02 00:00:00 |
+-------------------------------------------------+
select date_trunc('2023-4-05 19:28:30', 'week');
+-------------------------------------------+
| date_trunc('2023-04-05 19:28:30', 'week') |
+-------------------------------------------+
| 2023-04-03 00:00:00 |
+-------------------------------------------+
select date_trunc(cast('2010-12-02' as date), 'month');
+-------------------------------------------------+
| date_trunc(cast('2010-12-02' as date), 'month') |
+-------------------------------------------------+
| 2010-12-01 |
+-------------------------------------------------+
select date_trunc('2010-12-02 19:28:30', 'quarter');
+-------------------------------------------------+
| date_trunc('2010-12-02 19:28:30', 'quarter') |
+-------------------------------------------------+
| 2010-10-01 00:00:00 |
+-------------------------------------------------+
select date_trunc('2010-12-02 19:28:30', 'year');
+-------------------------------------------------+
| date_trunc('2010-12-02 19:28:30', 'year') |
+-------------------------------------------------+
| 2010-01-01 00:00:00 |
+-------------------------------------------------+
-- For datetime with scale, fractional digits will be truncated to zero without rounding, but return value retains scale
mysql> select date_trunc('2010-12-02 19:28:30.523', 'second');
+-------------------------------------------------+
| date_trunc('2010-12-02 19:28:30.523', 'second') |
+-------------------------------------------------+
| 2010-12-02 19:28:30.000 |
+-------------------------------------------------+
-- Example of TimeStampTz type, SET time_zone = '+08:00'
-- Convert the variable value to local_time(2026-01-01 02:59:59) before truncation
SELECT DATE_TRUNC('2025-12-31 23:59:59+05:00', 'year');
+-------------------------------------------------+
| DATE_TRUNC('2025-12-31 23:59:59+05:00', 'year') |
+-------------------------------------------------+
| 2026-01-01 00:00:00+08:00 |
+-------------------------------------------------+
-- Unsupported unit, returns error
select date_trunc('2010-12-02 19:28:30', 'quar');
ERROR 1105 (HY000): errCode = 2, detailMessage = date_trunc function time unit param only support argument is year|quarter|month|week|day|hour|minute|second