W tym artykule omówimy daty Postgres, różne typy danych dat, zastosowania i funkcje.
Znaczniki daty i czasu są przydatne do analizy danych i przechowywania danych w celu sprawdzenia, kiedy zdarzenie rzeczywiście miało miejsce. Na przykład, gdy masz zamówienia zakupu i sprzedaży, miesięczne lub kwartalne zarobki i nie tylko. Formaty dat różnią się w zależności od kraju, dlatego może to być skomplikowane zadanie dla osób, które dopiero zaczynają zarządzać bazami danych i pracują z kolumnami dat. Format lub typ danych kolumny daty powinien być zawsze zgodny z danymi wprowadzonymi przez użytkownika. Dodatkowo należy przekonwertować wyświetlanie formatu daty zgodnie z wymaganiami użytkownika.
Postgres ma wiele obsługiwanych typów danych. Zanim przejdziesz dalej, sugeruję zapoznanie się z tematem Eksploracja różnych typów danych Postgres, aby lepiej je zrozumieć.
Typ danych Postgres DATE
Postgres używa typu danych DATE do przechowywania różnych dat w formacie RRRR-MM-DD. Używa 4 bajtów do przechowywania wartości daty w kolumnie.
- Najniższa data:4713 pne
- Najwyższa data:5874897 pne
- Format daty:RRRR-MM-DD (np. 2021-01-01)
Możesz zaprojektować tabelę Postgres z kolumną DATE i użyć słowa kluczowego DEFAULT CURRENT_DATE aby użyć bieżącej daty systemowej jako wartości domyślnej w tej kolumnie.
CREATE TABLE SalesOrders ( Order_id serial PRIMARY KEY, Orderdetails VARCHAR (255) NOT NULL, OrderDate DATE NOT NULL DEFAULT CURRENT_DATE ); INSERT INTO SalesOrders (Orderdetails) VALUES('Sample Order for customer ABC'); SELECT * FROM SalesOrders;
Jak pokazano poniżej, SQL automatycznie wstawia wartość kolumny [OrderDate] z bieżącą datą systemową w formacie RRRR-MM-DD.
Funkcje Postgres DATE
Często musimy zmodyfikować format daty lub wykonać obliczenia na istniejących wartościach przechowywanych w tabeli Postgres. Na przykład w Indiach typowy format daty to DD-MM-RRRR. Dlatego też, gdy użytkownik z Indii przegląda dane, prawdopodobnie będziemy chcieli, aby wyświetlał dane w najbardziej znanym mu formacie. W tym przypadku kluczową rolę odgrywają funkcje SQL.
Funkcja TO_CHAR()
Ta funkcja jest pomocna przy przekazywaniu danych wyjściowych wartości daty Postgres w określonym formacie. Akceptuje następujące dwa parametry.
- Data wprowadzenia:jest to data, którą chcesz przekonwertować na określony format.
- Format daty:tutaj określasz nowy format daty.
Poniższe zapytanie konwertuje istniejące wartości dat przechowywane w tabeli [SalesOrders] na format DD-MM-RRRR.
SELECT Orderdetails,OrderDate as ExistingDateformat, to_char(OrderDate,'DD-MM-YYYY') As NewDateFormat FROM SalesOrders;
Obsługiwane wartości w funkcji to_char() są pokazane poniżej.
RRRR | Rok czterocyfrowy |
RRRR | Ostatnie trzy cyfry roku |
RR | Ostatnie dwie cyfry roku |
MIESIĄC | Nazwa miesiąca wielkimi literami |
Miesiąc | Nazwa miesiąca z pierwszą wielką literą |
miesiąc | Nazwa miesiąca małymi literami |
PON/PON/PON | Skrót miesiąca odpowiednio wielkimi, pierwszą wielką literą i wszystkimi małymi literami |
MM | Numer miesiąca (01-12) |
DZIEŃ/Dzień/dzień | Nazwa dnia odpowiednio wielką, pierwszą wielką literą i wszystkimi małymi literami |
DDD | Dzień w roku (001 do 366) |
DD | Dzień miesiąca (od 01 do 31) |
D | Dzień tygodnia (od niedzieli (1) do soboty (7)) |
W | Tydzień miesiąca |
WW | Tydzień roku |
W poniższym SQL podano kilka przykładów różnych formatów daty.
SELECT Orderdetails,OrderDate as ExistingDateformat, to_char(OrderDate,'DD-MM-YYYY') As DDMMYYYY, to_char(OrderDate,'DD-MM-YY') As DDMMYY, to_char(OrderDate,'DD.MM.YY') As "DD.MM.YY", to_char(OrderDate,'MM/DD/YYYY') As "MM/DD/YYYY", to_char(OrderDate,'DAY MM/DD/YYYY') As "MM/DD/YYYY", to_char(OrderDate,'DDD MM/DD/YYYY') As "DDD MM/DD/YYYY" FROM SalesOrders
Funkcja Now()
Funkcja Now() zwraca aktualny znacznik czasu systemu (data i godzina).
Możesz określić podwójne dwukropki (::), aby rzutować wartość DATETIME na wartość DATE.
Możesz połączyć TO_CHAR() i Now(), aby przekonwertować bieżący znacznik czasu na określony format.
SELECT TO_CHAR(NOW() :: DATE, 'dd-mm-yyyy');
Operator minus i interwał
Możesz użyć operatora minus (-), aby obliczyć różnicę między dwiema datami. Na przykład poniższe zapytanie zwraca interwał między bieżącym znacznikiem czasu a [DataZamówienia] z tabeli SalesOrders.
SELECT Orderdate,now() as currentdate, now()-Orderdate as Interval FROM SalesOrders where order_id=2;
Możesz także określić interwał zwracania daty po określonym okresie. Na przykład poniższe zapytanie SQL daje następujące wartości.
- Dla przyszłej daty określ wartość interwału 2 godziny od bieżącego znacznika czasu: now() + interwał „2 godziny”
- Dla przyszłej daty określ wartość interwału wynoszącą 1 dzień od aktualnej sygnatury czasowej: now() + interwał „1 dzień”
- Dla daty przeszłej określ wartość interwału jeden rok od bieżącego znacznika czasu: Now() – interwał „1 rok”
- Oblicz rok po dacie na podstawie wartości przechowywanej w kolumnie [Orderdate]: data zamówienia – przedział „1 rok”
SELECT (NOW() + interval '2 hour') AS twohourslater, (NOW() + interval '1 day') AS Onedaylater, (NOW() - interval '1 year') AS OneYearBefore, (Orderdate- interval '1 year') as Orderdatedifference from salesorders;
Funkcja WIEK()
Funkcja AGE() zwraca różnicę dat w latach, miesiącach i dniach. Możesz użyć tej funkcji do obliczenia wieku osoby.
Ta funkcja akceptuje dwa parametry daty i odejmuje pierwszą wartość daty od drugiej.
Jeśli odwrócisz wartości w powyższym skrypcie funkcji, zwróci ona wartość ujemną.
W innym przykładzie załóżmy, że ktoś ma datę urodzenia 1990-07-01. Dlatego wiek osoby można obliczyć jak poniżej.
SELECT current_date, AGE(timestamp '1990-07-01') as EmpAge;
Funkcja EXTRACT()
Funkcja Extract() zwraca dzień, tydzień, miesiąc, rok i kwartał z określonej wartości daty.
Wyodrębnij rok
SELECT EXTRACT(YEAR FROM TIMESTAMP '2021-06-28 10:30:15') as year;
Wyodrębnij miesiąc
SELECT EXTRACT(Month FROM TIMESTAMP '2021-06-28 10:30:15') as Month;
Wyodrębnij ćwierć
SELECT EXTRACT(QUARTER FROM TIMESTAMP '2021-06-28 10:30:15') as QUARTER;
Wyodrębnianie dnia tygodnia
SELECT EXTRACT(DOW FROM TIMESTAMP '2021-06-28 10:30:15') as DOW ;
Wyodrębnianie dnia w roku
SELECT EXTRACT(DOY FROM TIMESTAMP '2021-06-28 10:30:15') as DOY ;
Możesz także użyć funkcji EXTRACT() w połączeniu z INTERVAL. Na przykład poniżej określamy interwał jako 7 lat 9 miesięcy 20 dni 09 godzin 12 minut i 13 sekund. Funkcja extract zwraca poszczególne wartości.
SELECT EXTRACT(YEAR FROM INTERVAL '7 years 9 months 20 days 09 hours 12 minutes 13 second' ), EXTRACT(Month FROM INTERVAL '7 years 9 months 20 days 09 hours 12 minutes 13 second' ), EXTRACT(Day FROM INTERVAL '7 years 9 months 20 days 09 hours 12 minutes 13 second' ), EXTRACT(hour FROM INTERVAL '7 years 9 months 20 days 09 hours 12 minutes 13 second' ), EXTRACT(Minute FROM INTERVAL '7 years 9 months 20 days 09 hours 12 minutes 13 second' ); ;
W STREFIE CZASOWEJ
Czasami trzeba przekonwertować znacznik czasu na inną strefę czasową. Na przykład możesz przechowywać wartości dat w UTC (uniwersalny koordynator czasu) i przekonwertować strefę czasową zgodnie z wymaganiami.
SELECT * FROM pg_timezone_names;
Aby sprawdzić aktualną strefę czasową, użyj POKAŻ STREFĘ CZASOWĄ, jak pokazano poniżej.
Możesz wybrać wymaganą wartość strefy czasowej z pg_timezone_names i użyć AT TIME ZONE do uzyskania danych wyjściowych dla określonej strefy czasowej.
SELECT '2021-06-28 07:09:19'::timestamp AT TIME ZONE 'America/Chicago';
Podobnie, możemy uzyskać różne wyjścia stref czasowych za pomocą AT TIME ZONE.
SELECT '2021-06-28 07:09:19'::timestamp AT TIME ZONE 'America/New_York';
SELECT '2021-06-28 07:09:19'::timestamp AT TIME ZONE 'Asia/Qatar';
SELECT '2021-06-28 07:09:19'::timestamp AT TIME ZONE 'Europe/Istanbul';
Podsumowanie
Typy dat Postgres są niezbędne i cenne podczas przechowywania dat i znaczników czasu w prawie każdej tabeli relacyjnej bazy danych. Potrzebujesz ich do różnych celów, takich jak wstawianie zamówień lub aktualizowanie znaczników czasu, zamówień zakupu i sprzedaży, szczegółów wydarzeń, informacji o klientach i pracownikach i nie tylko. Możesz użyć wielu funkcji Postgres, aby przekonwertować typ daty na wymaganą strefę czasową, format i określone informacje, aby uprościć wyodrębnianie i analizę danych.