この記事では、Postgresの日付、さまざまな日付のデータ型、用途、機能について説明します。
日付とタイムスタンプは、データ分析と、イベントが実際にいつ発生したかを確認するためのデータの保存に役立ちます。たとえば、購入注文や販売注文がある場合、月次または四半期ごとの収益などがあります。日付の形式は国によって異なるため、データベース管理に不慣れで日付列を操作している人にとっては複雑な作業になる可能性があります。日付列の形式またはデータ型は、常にユーザーの入力と一致する必要があります。さらに、ユーザーの要件に応じて日付形式の表示を変換する必要があります。
Postgresには、サポートされているさまざまなデータ型があります。先に進む前に、さまざまなPostgresデータ型の調査を参照して、これらをさらに詳しく理解することをお勧めします。
PostgresDATEデータ型
PostgresはDATEデータ型を使用して、さまざまな日付をYYYY-MM-DD形式で格納します。日付値を列に格納するために4バイトを使用します。
- 最低日:紀元前4713年
- 最高日:紀元前5874897年
- 日付形式:YYYY-MM-DD(例2021-01-01)
DATE列を使用してPostgresテーブルを設計し、キーワード DEFAULTを使用できます。 CURRENT_DATE 現在のシステム日付をこの列のデフォルト値として使用します。
CREATE TABLE SalesOrders ( Order_id serial PRIMARY KEY, Orderdetails VARCHAR (255) NOT NULL, OrderDate DATE NOT NULL DEFAULT CURRENT_DATE ); INSERT INTO SalesOrders (Orderdetails) VALUES('Sample Order for customer ABC'); SELECT * FROM SalesOrders;
以下に示すように、SQLは[OrderDate]列の値を、現在のシステム日付とともにYYYY-MM-DD形式で自動的に挿入します。
PostgresDATE関数
多くの場合、日付形式を変更したり、Postgresテーブルに保存されている既存の値を計算したりする必要があります。たとえば、インドでは、通常の日付形式はDD-MM-YYYYです。したがって、インドのユーザーがデータを表示するときは、最も使い慣れた形式でデータを表示する必要があります。この場合、SQL関数が重要な役割を果たします。
TO_CHAR()関数
この関数は、Postgresの日付値を指定された形式で出力するのに役立ちます。次の2つのパラメータを受け入れます。
- 入力日:これは、特定の形式に変換する日付です。
- 日付形式:ここで、新しい日付形式を指定します。
次のクエリは、[SalesOrders]テーブルに保存されている既存の日付値をDD-MM-YYYY形式に変換します。
SELECT Orderdetails,OrderDate as ExistingDateformat, to_char(OrderDate,'DD-MM-YYYY') As NewDateFormat FROM SalesOrders;
to_char()関数でサポートされている値は次のとおりです。
YYYY | |
YYY | |
YY | |
MON / Mon / mon | すべて大文字、最初の文字は大文字、すべて小文字の月の略語 |
MM | 月番号(01-12) |
すべて大文字の曜日名、大文字の最初の文字、すべて小文字 | |
DDD | 年の日(001から366) |
DD | 曜日(01から31) |
D | 曜日(日曜日(1)から土曜日(7)) |
W | |
WW |
さまざまな日付形式のいくつかの例は、次のSQLで指定されています。
SELECT Orderdetails,OrderDate as ExistingDateformat, to_char(OrderDate,'DD-MM-YYYY') As DDMMYYYY, to_char(OrderDate,'DD-MM-YY') As DDMMYY, to_char(OrderDate,'DD.MM.YY') As "DD.MM.YY", to_char(OrderDate,'MM/DD/YYYY') As "MM/DD/YYYY", to_char(OrderDate,'DAY MM/DD/YYYY') As "MM/DD/YYYY", to_char(OrderDate,'DDD MM/DD/YYYY') As "DDD MM/DD/YYYY" FROM SalesOrders
Now()関数
Now()関数は、現在のシステムタイムスタンプ(日付と時刻)を返します。
二重コロン(::)を指定して、DATETIME値をDATE値にキャストできます。
TO_CHAR()関数とNow()関数を組み合わせて、現在のタイムスタンプを指定された形式に変換できます。
SELECT TO_CHAR(NOW() :: DATE, 'dd-mm-yyyy');
マイナス(-)演算子を使用して、2つの日付の差を計算できます。たとえば、以下のクエリは、現在のタイムスタンプと[Orderdate]の間の間隔をSalesOrdersテーブルから返します。
SELECT Orderdate,now() as currentdate, now()-Orderdate as Interval FROM SalesOrders where order_id=2;
指定した期間の後に日付を返す間隔を指定することもできます。たとえば、次のSQLクエリは次の値を提供します。
- 将来の日付については、現在のタイムスタンプから2時間の間隔値を指定します: now()+間隔「2時間」
- 将来の日付については、現在のタイムスタンプから1日の間隔値を指定します: now()+間隔「1日」
- 過去の日付の場合、現在のタイムスタンプから1年の間隔値を指定します: Now()–間隔「1年」
- [Orderdate]列に保存されている値から日付から1年後を計算します: orderdate –間隔「1年」
SELECT (NOW() + interval '2 hour') AS twohourslater, (NOW() + interval '1 day') AS Onedaylater, (NOW() - interval '1 year') AS OneYearBefore, (Orderdate- interval '1 year') as Orderdatedifference from salesorders;
AGE()関数
AGE()関数は、年、月、日で日付の差を返します。この関数を使用して、人の年齢を計算できます。
この関数は2つの日付パラメーターを受け入れ、2番目の日付値から最初の日付値を減算します。
上記の関数スクリプトの値を逆にすると、負の値が返されます。
別の例では、誰かが1990-07-01の生年月日を持っているとしましょう。したがって、人の年齢は次のように計算できます。
SELECT current_date, AGE(timestamp '1990-07-01') as EmpAge;
EXTRACT()関数
Extract()関数は、指定された日付値から日、週、月、年、および四半期を返します。
1年を抽出
SELECT EXTRACT(YEAR FROM TIMESTAMP '2021-06-28 10:30:15') as year;
1か月を抽出
SELECT EXTRACT(Month FROM TIMESTAMP '2021-06-28 10:30:15') as Month;
四半期を抽出
SELECT EXTRACT(QUARTER FROM TIMESTAMP '2021-06-28 10:30:15') as QUARTER;
曜日の抽出
SELECT EXTRACT(DOW FROM TIMESTAMP '2021-06-28 10:30:15') as DOW ;
その年の日を抽出する
SELECT EXTRACT(DOY FROM TIMESTAMP '2021-06-28 10:30:15') as DOY ;
EXTRACT()関数をINTERVALと組み合わせて使用することもできます。たとえば、以下では、間隔を7年9か月20日09時間12分13秒と指定します。抽出関数は個々の値を返します。
SELECT EXTRACT(YEAR FROM INTERVAL '7 years 9 months 20 days 09 hours 12 minutes 13 second' ), EXTRACT(Month FROM INTERVAL '7 years 9 months 20 days 09 hours 12 minutes 13 second' ), EXTRACT(Day FROM INTERVAL '7 years 9 months 20 days 09 hours 12 minutes 13 second' ), EXTRACT(hour FROM INTERVAL '7 years 9 months 20 days 09 hours 12 minutes 13 second' ), EXTRACT(Minute FROM INTERVAL '7 years 9 months 20 days 09 hours 12 minutes 13 second' ); ;
場合によっては、タイムスタンプを別のタイムゾーンに変換する必要があります。たとえば、日付の値をUTC(協定世界時)で保存し、必要に応じてタイムゾーンを変換できます。
SELECT * FROM pg_timezone_names;
現在のタイムゾーンを確認するには、以下に示すようにSHOWTIMEZONEを使用します。
pg_timezone_namesから必要なタイムゾーン値を選択し、AT TIME ZONEを使用して、指定したタイムゾーンごとの出力を取得できます。
SELECT '2021-06-28 07:09:19'::timestamp AT TIME ZONE 'America/Chicago';
同様に、ATTIMEZONEを使用してさまざまなタイムゾーン出力を取得できます。
SELECT '2021-06-28 07:09:19'::timestamp AT TIME ZONE 'America/New_York';
SELECT '2021-06-28 07:09:19'::timestamp AT TIME ZONE 'Asia/Qatar';
SELECT '2021-06-28 07:09:19'::timestamp AT TIME ZONE 'Europe/Istanbul';
Postgresの日付タイプは、リレーショナルデータベースのほぼすべてのテーブルに日付とタイムスタンプを格納する場合に不可欠であり、価値があります。注文の挿入やタイムスタンプの更新、購入と販売の注文、イベントの詳細、顧客と従業員の情報など、さまざまな目的で必要になります。複数のPostgres関数を使用して、日付タイプを必要なタイムゾーン、形式、および特定の情報に変換し、データの抽出と分析を簡素化できます。