Trừ 1 ngày cho ngày dấu thời gian


98

Tôi đang sử dụng Datagrip cho Postgresql. Tôi có một bảng với trường ngày ở định dạng dấu thời gian (ex: 2016-11-01 00:00:00). Tôi muốn có khả năng để:

  1. áp dụng một toán tử toán học để trừ đi 1 ngày
  2. lọc nó dựa trên khoảng thời gian hôm nay-130 ngày
  3. hiển thị nó mà không có phần hh / mm / ss của tem (2016-10-31)

Truy vấn bắt đầu hiện tại:

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

Các ((date_at)-1)khoản trên dòng 1 kết quả trong:

[42883] LỖI: toán tử không tồn tại: dấu thời gian không có múi giờ - số nguyên Gợi ý: Không có toán tử nào phù hợp với (các) loại đối số và tên đã cho. Bạn có thể cần thêm phôi kiểu rõ ràng. Chức vụ: 69

Các now()khoản spawns một thông điệp tương tự:

[42883] LỖI: không tồn tại toán tử: dấu thời gian với múi giờ - số nguyên Gợi ý: Không có toán tử nào phù hợp với (các) loại đối số và tên đã cho. Bạn có thể cần thêm phôi kiểu rõ ràng. Chức vụ: ...

Hướng dẫn trực tuyến để nhập phôi đặc biệt không hữu ích. Đầu vào được đánh giá cao.

Câu trả lời:


226

Sử dụng INTERVALloại cho nó. Ví dụ:

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

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

Sau đó, bạn có thể làm như sau trên truy vấn của mình:

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;


LỜI KHUYÊN

Mẹo 1

Bạn có thể nối nhiều toán hạng. Vd: làm thế nào để có được ngày cuối cùng của tháng hiện tại?

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

Mẹo 2

Bạn cũng có thể tạo một make_intervalhàm bằng cách sử dụng khoảng thời gian , hữu ích khi bạn cần tạo nó trong thời gian chạy (không sử dụng chữ):

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


Thêm thông tin:

Các hàm và toán tử ngày / giờ

datatype-datetime (Giá trị đặc biệt) .


Đối với những người đang thắc mắc, "allballs" là nghĩa đen của nửa đêm, bởi vì nó trông giống như 00:00:00.
wim
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.