はじめに
データベースに日付値を格納する機能により、クエリやデータ分析に時間要素を追加できます。注文情報、人々の年齢、またはその他のユースケースなど、レポートで正確を期すためには、それぞれのデータベースで日付型を操作する方法を知ることが重要です。
このガイドでは、PostgreSQLでのDATE
型の格納と、それらを操作するさまざまな方法について説明します。
PostgreSQL DATE
データ型
PostgreSQLのDATE
型は、関連付けられた時刻値なしで日付を格納できます。
DATE
PostgreSQLは日付値を格納するために4バイトを使用します。PostgreSQLの日付値の範囲は、紀元前4713年から西暦5874897年です。
日付値を格納する場合、PostgreSQLはyyyy-mm-dd
形式(例:1994-10-27)を使用します。この形式は、PostgreSQLでデータを挿入する際にも使用されます。
PostgreSQLでは、現在の日付のデフォルト日付値を設定できます。これは、DEFAULT
キーワードとCURRENT_DATE
キーワードを使用してテーブルを作成するときに行うことができます。ライブラリのチェックアウトテーブルのlast_checkout
列は、デフォルトで現在の日付を受け入れます。
CREATE TABLE checkouts (author_id serial PRIMARY KEY,author_name VARCHAR (255) NOT NULL,book_title VARCHAR (255) NOT NULL,published_date DATE NOT NULL,last_checkout DATE NOT NULL DEFAULT CURRENT_DATE);
このテーブル構造に従って、INSERT INTO
ステートメントでデータを挿入できます。
INSERT INTO checkouts (author_name, book_title, published_date)VALUES('James Joyce', 'Ulysses', '1922-02-02');
次に、checkouts
テーブルをクエリすると、次のようになります。
SELECT * FROM checkouts;author_id | author_name | book_title | published_date | last_checkout-----------+-------------+------------+----------------+---------------1 | James Joyce | Ulysses | 1922-02-02 | 2021-09-27(1 row)
PostgreSQL DATE
関数
PostgreSQLのDATE
型の詳細を知ることで、格納した情報を操作する関数を使用できるようになります。前のセクションで紹介したテーブルを基に、いくつかの一般的な関数を見ていきましょう。
現在の日付を取得する
PostgreSQLでは、組み込みのNOW()
関数を使用して現在の日付と時刻を取得できます。次のステートメントは、日付と時刻の両方を返します。
SELECT NOW();now-------------------------------2021-09-27 15:22:53.679985+02(1 row)
時刻が不要な場合は、ダブルコロン::
を使用してDATETIME
値をDATE
値にキャストすることで、日付のみを返すように指定することもできます。
SELECT NOW()::date;now------------2021-09-27(1 row)
CURRENT_DATE
を使用することも、以下に示すように現在の日付を取得する別の方法です。
SELECT CURRENT_DATE;current_date--------------2021-09-27(1 row)
これらの3つのオプションはすべて、日付をyyyy-mm-dd
形式で返します。PostgreSQL内では、必要に応じてこの出力の形式を調整できます。
特定の形式で日付値を出力する
特定の形式で日付値を出力するには、TO_CHAR()
関数を使用します。この関数は2つのパラメータを受け入れます。
- フォーマットする値
- 出力形式を定義するテンプレート
SELECT TO_CHAR(NOW()::date, 'dd/mm/yyyy');to_char------------27/09/2021(1 row)
Sep 27, 2021
のような形式で日付を表示することもできます。
SELECT TO_CHAR(NOW():: DATE, 'Mon dd, yyyy');to_char--------------Sep 27, 2021(1 row)
システムの要件によっては、特定の方法でフォーマットされた日付が必要になる場合があります。これは、PostgreSQLで出力を指定できることが役立つシナリオです。
2つの日付間の間隔を取得する
PostgreSQLでは、間隔を-
演算子を使用して2つの日付間で取得できます。この演算子を使用すると、従業員の在職期間や本の出版からの時間などを計算できます。
この例では、ジョイスのユリシーズが出版されてから何日経過したかを、現在の日付からpublished_date
を引くことで求めます。
SELECTauthor_name,book_title,now()::date - published_date as diffFROMcheckouts;
結果
author_name | book_title | diff-------------+------------+----------------------------James Joyce | Ulysses | 36397 days(1 row)
日付値を使用した年齢の計算
同じ例を続けて、AGE()
関数を使用して、現在の日付での年齢を年、月、日で計算できます。次のステートメントは、AGE()
関数を使用して、ライブラリのcheckouts
テーブルから出版物の年齢を計算します。
SELECTauthor_name,book_title,AGE(published_date)FROMcheckouts;
この関数を使用すると、在庫内の本の古さを計算できます。
author_name | book_title | age-------------+------------+-------------------------James Joyce | Ulysses | 99 years 7 mons 25 days(1 row)
AGE()
関数に単一の日付を渡すと、現在の日付を自動的に使用して減算および計算することに注意することが重要です。年齢を計算するために、2つの日付を関数に渡すこともできます。
SELECTauthor_name,book_title,AGE('2000-01-01',published_date),FROMcheckouts;
結果
author_name | book_title | age-------------+------------+--------------------------James Joyce | Ulysses | 77 years 10 mons 27 days(1 row)
日付値から年、四半期、月、週、または日を抽出する
最後に説明する関数は、PostgreSQLのEXTRACT()
関数です。これにより、年、四半期、月、日などの日付のコンポーネントを分離できます。
次のステートメントは、ユリシーズの出版日から年、月、日を抽出します。
SELECTauthor_name,book_title,EXTRACT(YEAR FROM published_date) AS YEAR,EXTRACT(MONTH FROM published_date) AS MONTH,EXTRACT(DAY FROM published_date) AS DAYFROMcheckouts;
結果は次のようになります。
author_name | book_title | year | month | day-------------+------------+------+-------+-----James Joyce | Ulysses | 1922 | 2 | 2(1 row)
これは、たとえば、データを使用した計算に日付値の一部のみが必要な場合に知っておくと便利な関数です。
結論
このガイドでは、PostgreSQLのDATE
データ型でできることの基本を説明しました。データベース内で日付データがどのように機能するかを知ることが重要です。それにアクセスして操作する方法を把握することで、年齢計算を行ったり、クエリで抽出を実行したり、必要に応じて別のシステムの要件に合わせて出力を構成したりできます。
PostgreSQLでPrisma Clientを使用している場合は、Prisma ClientがPostgreSQLの日付型をどのように変換するかについての情報があります。
FAQ
PostgreSQLの日付データ型の日付形式はyyyy-mm-dd
です。これは、データの保存とデータの挿入の両方に使用される形式です。
PostgreSQLのDATE_PART()
関数は、日付または時刻値からサブフィールドをサブクエリするために使用されます。
基本的な構文は次のようになります。
SELECT DATE_PART(field, source);
たとえば、次のように記述して時間を返すことができます。20
SELECT DATE_PART('hour', timestamp '2001-02-16 20:38:40');
PostgreSQLのTO_DATE()
関数は、テキスト文字列を日付型に変換するために使用できます。
基本的な構文は次のとおりです。
TO_DATE(text, format);
たとえば、
TO_DATE('20220317', 'YYYYMMDD');
2022-03-17
の出力が返されます。
PostgreSQLで日付の一部を抽出するには、EXTRACT()
関数を使用できます。この関数は、日付型から年、月、または日を解析したり、四半期を指定したりできます。
基本的な構文は次のとおりです。
SELECT EXTRACT(field FROM source);
例としては、
SELECT EXTRACT(YEAR FROM TIMESTAMP '2022-03-17 20:38:16');
このステートメントの戻り値は2022
になります。
PostgreSQLでタイムスタンプを切り捨てるには、DATE_TRUNC()
関数を使用できます。この関数は、年、月、日などの指定された日付部分に基づいてTIMESTAMP
またはINTERVAL
を切り捨てます。
基本的な構文は次のとおりです。
DATE_TRUNC('datepart' field);
例としては、
DATE_TRUNC('hour', TIMESTAMP '2022-03-17 02:09:30');
このステートメントの戻り値は2022-03-17 02:00:00
になります。