今日の日付を基準にデータの範囲絞るSQL書いてみた

2022.11.22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

データアナリティクス事業本部の荒木です。

Redshiftで日付でデータ絞るときの関数を使う機会があったのでまとめたいと思います。

関数

・今日の日付取得

SELECT GETDATE()

現在の日付の完全なタイムスタンプで取得することができます。

SELECT GETDATE();

|date                      |
+--------------------------+
|2022-11-22 15:02:05.000   |

SELECT CURRENT_DATE

今日の日付を年、月、日で取得することができます。

SELECT CURRENT_DATE;

|date         |
+-------------+
|2022-10-01   |

GETDATE()で得たタイムスタンプをTRUNC()と一緒に使用することで年、月、日だけに絞ることもできます。

SELECT TRUNC(GETDATE());

|date         |
+-------------+
|2022-10-01   |

・指定したdatepartに基づいて切り捨てられた日付取得

SELECT DATE_TRUNC('datepart', timestamp)

指定したdatepartによって切り捨てられたタイムスタンプを取得できます。

SELECT DATE_TRUNC('day', DATE'2022-11-22 15:02:05.000');

|date                      |
+--------------------------+
|2022-11-22 00:00:00.000   |

・指定した日付部分のみを取得

SELECT DATE_PART(datepart, {date|timestamp})

指定したdatepartによって指定した日付の値を取得できます。

SELECT DATE_PART('day', DATE'2022-11-22 15:02:05.000');

|date |
+-----+
|11   |

・指定した日付部分に値を加える

SELECT DATEADD(datepart, interval, {date|time|timetz|timestamp})

指定したdatepartによって指定した日付に値を加えることができます。

SELECT DATEADD('day', 10 , DATE'2022-11-22 15:02:05.000');

|date                      |
+--------------------------+
|2022-12-02 00:00:00.000   |

サンプルコード

日付データを基準にデータ絞るコードを書いてみました。 月を指定したDATE_TRUNCに今日の月を基準に6か月前から3か月前までを指定しています。
DATEADDは負の値を指定することもできます。
日にちまで指定したければDATEADDで指定した日数を指定することができます。

SELECT * from {schema}.{table}
where date_col BETWEEN 
    DATEADD('day', 10, DATEADD('mon', -6, DATE_TRUNC('mon', CURRENT_DATE)))
    and
    DATEADD('day', 10, DATEADD('mon', -3, DATE_TRUNC('mon', CURRENT_DATE)))

まとめ

実際に使った関数についてまとめてみました。
何かの参考になればと思います。