タイムスタンプの日付から1日を引く


105

PostgresqlにDatagripを使用しています。タイムスタンプ形式の日付フィールドを持つテーブルがあります(ex: 2016-11-01 00:00:00)。次のことができるようになりたい:

  1. 数学演算子を適用して1日を減算します
  2. 今日の時間枠に基づいてフィルタリングします-130日
  3. スタンプのhh / mm / ss部分なしで表示する(2016-10-31)

現在の開始クエリ:

select org_id, count(accounts) as count, ((date_at) - 1) as dateat 
from sourcetable 
where  date_at <= now() - 130
group by org_id, dateat

((date_at)-1)1行目の句の結果は次のとおりです。

[42883]エラー:演算子が存在しません:タイムゾーンのないタイムスタンプ-整数ヒント:指定された名前と引数のタイプに一致する演算子がありません。明示的な型キャストを追加する必要があるかもしれません。位置:69

このnow()句は、同様のメッセージを生成します。

[42883]エラー:演算子が存在しません:タイムゾーン付きのタイムスタンプ-整数ヒント:指定された名前と引数のタイプに一致する演算子がありません。明示的な型キャストを追加する必要があるかもしれません。ポジション: ...

型キャストのオンラインガイドは、非常に役に立ちません。入力をいただければ幸いです。

回答:


238

INTERVALそれにタイプを使用してください。例えば:

--yesterday
SELECT NOW() - INTERVAL '1 DAY';

--Unrelated to the question, but PostgreSQL also supports some shortcuts:
SELECT 'yesterday'::TIMESTAMP, 'tomorrow'::TIMESTAMP, 'allballs'::TIME;

次に、クエリに対して次の操作を実行できます。

SELECT 
    org_id,
    count(accounts) AS COUNT,
    ((date_at) - INTERVAL '1 DAY') AS dateat
FROM 
    sourcetable
WHERE 
    date_at <= now() - INTERVAL '130 DAYS'
GROUP BY 
    org_id,
    dateat;


チップ

ヒント1

複数のオペランドを追加できます。例:今月の最終日を取得する方法は?

SELECT date_trunc('MONTH', CURRENT_DATE) + INTERVAL '1 MONTH - 1 DAY';

ヒント2

make_interval関数を使用して間隔を作成することもできます。これは、実行時に(リテラルを使用せずに)作成する必要がある場合に役立ちます。

SELECT make_interval(days => 10 + 2);
SELECT make_interval(days => 1, hours => 2);
SELECT make_interval(0, 1, 0, 5, 0, 0, 0.0);


より詳しい情報:

日付/時刻関数と演算子

datatype-datetime(特別な値)


2
疑問に思っていた人にとって、「allballs」は00:00:00のように見えるため、真夜中の文字通りです。
WIM
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.