PostgreSQL DATE_TRUNC() 関数

Shihab Sikder 2023年6月20日
  1. PostgreSQL での DATE_TRUNC() 関数の使用
  2. "ミリ秒" Postgre の精度 DATE_TRUNC()
  3. Postgre の "second" 精度 DATE_TRUNC()
  4. Postgre の "minute" 精度 DATE_TRUNC()
  5. Postgre の "hour" 精度 DATE_TRUNC()
  6. Postgre の "day" 精度 DATE_TRUNC()
  7. Postgres のクエリで DATE_TRUNC() を使用する
PostgreSQL DATE_TRUNC() 関数

この記事では、コード スニペットを使用して Postgres の DATE_TRUNC() 関数について説明します。

PostgreSQL での DATE_TRUNC() 関数の使用

Postgres では、特定のタイムスタンプを特定のレベルの精度に切り詰めたり丸めたりすることができます。 たとえば、最も近い分、時間、日、月などに切り捨てることができます。

Postgres では、DATE_TRUNC() には次の間隔があります。

Century
Day
Decade
Hour
Minute
Microsecond
Millisecond
Second
Month
Quarter
Week
Year

これが現在のタイムスタンプです。 結果を確認するために、さまざまな間隔で使用します。

postgres=# SELECT NOW();
              now
-------------------------------
 2022-04-29 17:30:48.256668+06
(1 row)

"ミリ秒" Postgre の精度 DATE_TRUNC()

DATE_TRUNC() の精度としてミリ秒を使用します。

postgres=# SELECT DATE_TRUNC('millisecond', TIMESTAMP '2022-04-29 17:30:48.256668');
       date_trunc
-------------------------
 2022-04-29 17:30:48.256
(1 row)

ミリ秒は 256668 でした。 次に、256 に切り捨てられました。

Postgre の "second" 精度 DATE_TRUNC()

ここでは、DATE_TRUNC() の精度として "second" を使用します。

postgres=# SELECT DATE_TRUNC('second', TIMESTAMP '2022-04-29 17:30:48.256668');
     date_trunc
---------------------
 2022-04-29 17:30:48
(1 row)

小数部分が切り上げられて値が切り上げられていることがわかります。

Postgre の "minute" 精度 DATE_TRUNC()

DATE_TRUNC() の精度としてを使用しました。

postgres=# SELECT DATE_TRUNC('minute', TIMESTAMP '2022-04-29 17:30:48.256668');
     date_trunc
---------------------
 2022-04-29 17:30:00
(1 row)

分は30:48でした。 DATE_TRUNC(), を使用すると、30:00 になりました。

Postgre の "hour" 精度 DATE_TRUNC()

DATE_TRUNC() の精度として "hour" を使用しましょう。

postgres=# SELECT DATE_TRUNC('hour', TIMESTAMP '2022-04-29 17:30:48.256668');
     date_trunc
---------------------
 2022-04-29 17:00:00
(1 row)

17:30:48.25666817:00:00 の違いがわかります。

Postgre の "day" 精度 DATE_TRUNC()

DATE_TRUNC() の精度として "日" を使用します。

postgres=# SELECT DATE_TRUNC('day', TIMESTAMP '2022-04-29 17:30:48.256668');
     date_trunc
---------------------
 2022-04-29 00:00:00
(1 row)

時刻が00:00:00になっていることがわかります。 その日を締めくくった。

Postgres のクエリで DATE_TRUNC() を使用する

ホテルのチェックインで次のMOCK_DATAを持ってみましょう。

postgres=# SELECT * from MOCK_DATA;
 id  | first_name  |  last_name   |              email               |   gender    |  check_in
-----+-------------+--------------+----------------------------------+-------------+------------
   1 | Agustin     | Bawdon       | abawdon0@umn.edu                 | Male        | 2016-05-11
   2 | Maximilian  | Ber          | mber1@artisteer.com              | Male        | 2013-03-08
   3 | Randy       | Kline        | rkline2@pcworld.com              | Bigender    | 2019-01-01
   4 | Bonnibelle  | Mazillius    | bmazillius3@is.gd                | Female      | 2011-07-06
   5 | Rolland     | Hollidge     | rhollidge4@seesaa.net            | Male        | 2009-04-30
   6 | Sandro      | Hubbert      | shubbert5@nature.com             | Male        | 2019-11-26
   7 | Collin      | La Torre     | clatorre6@google.de              | Male        | 2016-02-12
   8 | Joleen      | Jerram       | jjerram7@instagram.com           | Female      | 2015-05-23
-- More  --

毎年のチェックインをカウントしたいと考えています。

SELECT
    date_trunc('year', check_in) year_no,
    COUNT(id) Customers
FROM
    MOCK_DATA
GROUP BY
    year_no
ORDER BY
    year_no;

出力:

        year_no         | customers
------------------------+-----------
 2008-01-01 00:00:00+06 |        17
 2009-01-01 00:00:00+06 |        20
 2010-01-01 00:00:00+06 |        15
 2011-01-01 00:00:00+06 |        20
 2012-01-01 00:00:00+06 |        19
 2013-01-01 00:00:00+06 |        18
 2014-01-01 00:00:00+06 |        13
 2015-01-01 00:00:00+06 |        24
 2016-01-01 00:00:00+06 |        18
 2017-01-01 00:00:00+06 |        13
 2018-01-01 00:00:00+06 |        23
 2019-01-01 00:00:00+06 |        17
 2020-01-01 00:00:00+06 |        16
 2021-01-01 00:00:00+06 |        12
 2022-01-01 00:00:00+06 |         5
(15 rows)

DATE_TRUNC() の詳細については、公式ドキュメント を参照してください。 moccaroo を使用して、サンプル データベースを生成できます。

著者: Shihab Sikder
Shihab Sikder avatar Shihab Sikder avatar

I'm Shihab Sikder, a professional Backend Developer with experience in problem-solving and content writing. Building secure, scalable, and reliable backend architecture is my motive. I'm working with two companies as a part-time backend engineer.

LinkedIn Website

関連記事 - PostgreSQL Function