Mengurangi 1 hari dari tanggal cap waktu

98

Saya menggunakan Datagrip untuk Postgresql. Saya memiliki tabel dengan bidang tanggal dalam format cap waktu (ex: 2016-11-01 00:00:00). Saya ingin bisa:

  1. terapkan operator matematika untuk mengurangi 1 hari
  2. filter berdasarkan jendela waktu hari ini-130 hari
  3. tampilkan tanpa bagian jj / mm / dt dari stempel (2016-10-31)

Kueri awal saat ini:

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

The ((date_at)-1)klausul pada baris 1 hasil dalam:

[42883] EROR: operator tidak ada: stempel waktu tanpa zona waktu - integer Petunjuk: Tidak ada operator yang cocok dengan nama yang diberikan dan tipe argumen. Anda mungkin perlu menambahkan cast tipe eksplisit. Posisi: 69

The now()klausul memunculkan pesan serupa:

[42883] ERROR: operator tidak ada: timestamp dengan zona waktu - integer Petunjuk: Tidak ada operator yang cocok dengan nama yang diberikan dan tipe argumen. Anda mungkin perlu menambahkan cast tipe eksplisit. Posisi: ...

Panduan online untuk mengetik pemeran sangat tidak membantu. Masukan dihargai.

J-Ko
sumber

Jawaban:

226

Gunakan INTERVALtipe untuk itu. Misalnya:

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

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

Kemudian Anda dapat melakukan hal berikut pada kueri Anda:

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

Tip 1

Anda dapat menambahkan beberapa operan. Misalnya: bagaimana cara mendapatkan hari terakhir bulan ini?

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

Tip 2

Anda juga dapat membuat interval menggunakan make_intervalfungsi, berguna saat Anda perlu membuatnya saat runtime (tidak menggunakan literal):

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


Info lebih lanjut:

Fungsi Tanggal / Waktu dan Operator

datatype-datetime (Nilai utama) .

Michel Milezzi
sumber