Odejmowanie 1 dnia od daty znacznika czasu

106

Używam Datagrip dla Postgresql. Mam tabelę z polem daty w formacie znacznika czasu (ex: 2016-11-01 00:00:00). Chcę móc:

  1. zastosuj operator matematyczny, aby odjąć 1 dzień
  2. filtruj je na podstawie okna czasowego obejmującego dziś - 130 dni
  3. wyświetlić go bez części znaczka gg / mm / ss (2016-10-31)

Bieżące zapytanie początkowe:

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)Klauzula na linii 1 Wyniki w:

[42883] BŁĄD: operator nie istnieje: znacznik czasu bez strefy czasowej - liczba całkowita Podpowiedź: Żaden operator nie jest zgodny z podaną nazwą i typem argumentów. Może być konieczne dodanie wyraźnych rzutów typu. Miejsce: 69

now()Klauzula ikra podobną wiadomość:

[42883] BŁĄD: operator nie istnieje: sygnatura czasowa ze strefą czasową - liczba całkowita Podpowiedź: Żaden operator nie pasuje do podanej nazwy i typu (-ów) argumentów. Może być konieczne dodanie wyraźnych rzutów typu. Stanowisko: ...

Internetowe przewodniki po typach rzutów są wyjątkowo nieprzydatne. Wkład jest mile widziany.

J-Ko
źródło

Odpowiedzi:

240

Użyj do tego INTERVALtypu. Na przykład:

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

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

Następnie możesz wykonać następujące czynności w swoim zapytaniu:

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;


WSKAZÓWKI

Porada 1

Możesz dołączyć wiele operandów. Np .: jak uzyskać ostatni dzień bieżącego miesiąca?

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

Porada 2

Możesz również utworzyć interwał za pomocą make_intervalfunkcji, przydatnej, gdy musisz go utworzyć w czasie wykonywania (bez użycia literałów):

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


Więcej informacji:

Funkcje i operatory daty / czasu

datatype-datetime (wartości specjalne) .

Michel Milezzi
źródło
2
Dla tych, którzy się zastanawiali, „allballs” to dosłowne określenie północy, ponieważ wygląda na 00:00:00.
wim