1. ホーム
  2. sql

[解決済み] SQLです。タイムスタンプの日付から1日分を差し引く

2022-03-04 07:02:50

質問

Datagrip for Postgresqlを使用しています。 タイムスタンプ形式の日付フィールドを持つテーブルがあります。 (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] ERROR: operator does not exist: timestamp without time zone - [42883] ERROR: オペレーターは存在しません。 整数 ヒント:指定された名前と引数の型に一致する演算子はありません。 明示的な型キャストを追加する必要があるかもしれません。位置 69

now() 節でも同様のメッセージが表示されます。

42883] ERROR: operator does not exist: timestamp with time zone - [42883] ERROR: operator does not exist: タイムスタンプが存在しない。 整数 ヒント:指定された名前と引数の型に一致する演算子はありません。 明示的な型キャストを追加する必要があるかもしれません。位置: ...

型キャストのオンラインガイドは役に立たないものばかりです。ご意見をお聞かせください。

どのように解決するのですか?

を使用します。 INTERVAL の型をそれに追加します。例

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

--Unrelated: PostgreSQL also supports some interesting shortcuts:
SELECT 
    'yesterday'::TIMESTAMP, 
    'tomorrow'::TIMESTAMP, 
    'allballs'::TIME AS aka_midnight;

すると、次のようになります。

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;

TIPS

ヒント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 (特別な値) .