はじめに

DATE_TRUNC関数を使うと、日付/時刻型のデータから、任意のフィールドまでデータを切り捨てることが可能です。
年や月という単一の項目でなく、年と月をセットにしてグルーピングしたい場合などに便利です。

構文

パラメータ名内容
精度後述の表の値のいずれかを指定します。
指定した精度より小さい値を切り捨てます。
※日と月は1に、それ以外のフィールドは0に設定されます。
切り捨て対象有効な日付/時刻データ

精度内容
MILLENNIUM千年紀(西暦の1000年区切り)
CENTURY世紀(西暦の100年区切り)
DECADE十年紀(西暦の10年区切り)
YEAR
QUARTER1年を4半期に区切った数値
1-3月=1
MONTH月(1-12)
WEEK週の番号(1-52,53,54)
※最大値は年により変動
DAY日(1-31)
HOUR時間(0-23)
MINUTE分(0-59)
SECOND秒(0-59)
MILLISECONDS小数部を含む秒フィールドに1000を掛けた値
MICROSECONDS小数部を含む秒フィールドに1,000,000を掛けた値

使用例

TIMESTAMP型のデータを対象に、任意の精度での切り捨てを行います。

集計関数への活用

切り捨てを行った結果でグループ化することにより、任意の期間での集計を行えます。
以下の、売上情報を格納するテーブルを例に確認します。
sold_date列の値が、1秒以下の位までデータを保持している点に注目してください。

日付データの任意のフィールド以下を切り捨て、切り捨て後の値でグループ化を行うことで、任意の日付単位で集計処理が行えます。

日ごとの累計売上を確認する場合

月ごとの累計売上を確認する場合

同様の結果を得られる関数

変換関数のTO_CHARでも、同様の結果を得られます。

ただし、TO_CHAR関数はデータ変換のオーバヘッドがあるため、クエリの性能面では、データの切り捨て処理をするだけのDATE_TRUNCに分があります。
大量データの処理であれば、DATE_TRUNCの使用をおすすめします。

参考:上記のTO_CHAR・DATE_TRUNCを本記事の集計クエリに使用した場合のコスト(※)
関数コスト
TO_CHAR285
DATE_TRUNC135


※クエリのコストの確認方法は、以下の記事をご確認ください。
SQLの実行計画を確認する方法
http://vertica-tech.ashisuto.co.jp/sql-plan/

分析関数への活用

ここからの内容は、分析関数の理解が前提知識として必要です。
分析関数については以下の記事をご確認ください。

分析関数(ウィンドウ関数)の概要
http://vertica-tech.ashisuto.co.jp/window_function/

DATE_TRUNC関数では、日付データを任意の粒度に変換できるため、分析関数のPARTITION BY句にも活用できます。
使用例は以下です。

上記のクエリの大まかな処理の流れは以下です。
1.月と日にちでグループ化(1,2,7行目)
2.日毎の売上の合計を集計(3行目:SUM集計関数を使用)
3.月でウィンドウ化し、ある月中の日毎の累計売上を表示(4,5行目:SUM分析関数を使用)

このように、DATE_TRUNC関数を活用すれば、ミリ秒までの細かい情報を保持しているTIMESTAMP型のデータであっても、月単位/日付単位/秒単位など様々な粒度でデータ分析を行えます。

参考情報

DATE_TRUNC
https://www.vertica.com/docs/9.2.x/HTML/Content/Authoring/SQLReferenceManual/Functions/Date-Time/DATE_TRUNC.htm

検証バージョンについて

この記事の内容はVertica 9.2で確認しています。

更新履歴

2019/05/15 本記事を公開