問題:
PostgreSQLの日付またはタイムスタンプ列から年の日を取得したいとします。
例:
私たちのデータベースには、software_sale
id
列にデータがあります 、software
、およびsale_date
。
id | ソフトウェア | sale_date |
---|---|---|
1 | スーパーゲームX | 2019-09-15 |
2 | ブラウザX | 2019-10-15 |
3 | DBニュース | 2019-11-26 |
4 | MyPaintSoft | 2018-10-15 |
5 | 新しいOS | 2019-10-15 |
1年の日ごとに販売されたソフトウェアアイテムの数を数えましょう。これを使用して、(実際の年とは関係なく)1年のうちどの曜日に売り上げが多かったか低かったかを調べます。
ソリューション1:
DATE_PART()
を使用します 働き。作成するクエリは次のとおりです。
SELECT DATE_PART('doy',sale_date) AS day_of_year, COUNT(id) as count FROM software_sale GROUP BY day_of_year;
クエリの結果は次のとおりです。
day_of_year | カウント |
---|---|
258 | 1 |
288 | 3 |
330 | 1 |
ディスカッション:
PostgreSQLのDATE_PART()
を使用します 日付/時刻/日時/タイムスタンプ列から年の日の番号を取得する関数。この関数は2つの引数を取ります。最初の引数は、関数に返す日付部分(または時間部分)です。この例では、「doy
」を使用しています ’、その年の日を返します。日、年、月、時、分、週などの他の部分を使用できます。詳細については、PostgreSQLのドキュメントを参照してください。
2番目の引数は、日付/時刻の部分を抽出する日付/時刻/日時/タイムスタンプです。これは、日付/時刻/日時/タイムスタンプ値を返す式、または日付/時刻/日時/タイムスタンプ列の名前にすることができます。 (この例では、 dateの列です。 データ型。)
関数DATE_PART()
「doy
’識別子は、その年の日の番号(1から365/366まで)を整数として返します。この例では、販売日の年の日(sale_date
から) column)が新しい列day_of_year
に表示されるようになりました 。 10月15日は2019年と2018年の288日目でした。当日は2年間で合計3回(2019年に2回、2018年に1回)の販売を行いました。
COUNT()
を使用します 販売数をカウントする集計関数。この関数は1つの引数を取ります。この場合、それはソフトウェアID番号です。 GROUP BY
も必要です このクエリの句を使用して、年の日に応じてレコードをグループ化します。 (この例では、実際の引数はday_of_year
です。 、DATE_PART('doy',sale_date)
のエイリアス 。)
これは、その年の日を取得する唯一の方法ではありません。 EXTRACT()
を使用することもできます 機能。
ソリューション2:
EXTRACT()
を使用して作成するクエリは次のとおりです。 機能:
SELECT EXTRACT('doy' FROM sale_date) AS day_of_year, COUNT(id) as count FROM software_sale GROUP BY day_of_year;
この関数はDATE_PART()
に似ています 。違いは、日付部分識別子と日付と時刻の引数の間にコンマの代わりにFROMを使用することです。結果は同じです。注:EXTRACT()
SQL標準です。