I denne artikel vil vi udforske Postgres-datoer, de forskellige datodatatyper, anvendelser og funktioner.
Dato- og tidsstempler er nyttige til dataanalyse og lagring af data for at kontrollere, hvornår en begivenhed rent faktisk fandt sted. For eksempel når du har købs- og salgsordrer, månedlig eller kvartalsvis indtjening med mere. Datoformater varierer på tværs af lande, derfor kan det være en kompliceret opgave for dem, der er nye til databaseadministration og arbejder med datokolonner. Datokolonnens format eller datatype skal altid matche brugerens input. Derudover bør du konvertere datoformatvisningen i henhold til din brugers krav.
Postgres har en række understøttede datatyper. Før du går videre, foreslår jeg, at du henviser til Udforske de forskellige Postgres-datatyper for at forstå disse mere detaljeret.
Postgres DATE datatype
Postgres bruger datatypen DATO til at gemme forskellige datoer i formatet ÅÅÅÅ-MM-DD. Den bruger 4 bytes til at gemme en datoværdi i en kolonne.
- Laveste dato:4713 f.Kr.
- Højeste dato:5874897 f.Kr.
- Datoformat:ÅÅÅÅ-MM-DD (f.eks. 2021-01-01)
Du kan designe en Postgres-tabel med en DATO-kolonne og bruge søgeordet DEFAULT CURRENT_DATE for at bruge den aktuelle systemdato som standardværdien i denne kolonne.
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;
Som vist nedenfor indsætter SQL en værdi for kolonnen [OrderDate] automatisk med den aktuelle systemdato i formatet ÅÅÅÅ-MM-DD.
Postgres DATE-funktioner
Vi er ofte nødt til at ændre datoformatet eller lave beregninger på eksisterende værdier gemt i Postgres-tabellen. For eksempel i Indien er det sædvanlige datoformat DD-MM-ÅÅÅÅ. Derfor, når en indisk bruger ser dataene, vil vi sandsynligvis have ham til at se data i det format, han er mest bekendt med. I dette tilfælde spiller SQL-funktioner en afgørende rolle.
TO_CHAR() funktion
Denne funktion er nyttig til at give output af en Postgres-datoværdi i et specificeret format. Den accepterer følgende to parametre.
- Indtastningsdato:Dette er den dato, du vil konvertere til et bestemt format.
- Datoformat:Det er her, du angiver det nye datoformat.
Følgende forespørgsel konverterer eksisterende datoværdier, der er gemt i tabellen [SalesOrders] til DD-MM-ÅÅÅÅ-format.
SELECT Orderdetails,OrderDate as ExistingDateformat, to_char(OrderDate,'DD-MM-YYYY') As NewDateFormat FROM SalesOrders;
De understøttede værdier i to_char()-funktionen er som vist nedenfor.
ÅÅÅÅ | Årtal med fire cifre |
ÅÅÅ | Sidste tre cifre i et år |
ÅÅ | Sidste to cifre i et år |
MÅNED | Månedens navn med store bogstaver |
Måned | Månedens navn med det første bogstav med stort |
måned | Månedens navn med små bogstaver |
MAN/man/man | Månedsforkortelse med henholdsvis stort stort, første bogstav med stort og alle små bogstaver |
MM | Månedsnummer (01-12) |
DAG/Dag/dag | Dagsnavn med stort, henholdsvis første bogstav med stort og alle små bogstaver |
DDD | Årets dag (001 til 366) |
DD | Dag i måneden (01 til 31) |
D | Ugedag (søndag (1) til lørdag (7)) |
W | Ugen i måneden |
WW | Årets uge |
Nogle få eksempler på forskellige datoformater er angivet i følgende SQL.
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
Now()-funktion
Funktionen Now() returnerer det aktuelle systemtidsstempel (dato og klokkeslæt).
Du kan angive dobbeltkolon (::) for at caste en DATETIME-værdi til en DATE-værdi.
Du kan kombinere TO_CHAR() og Now()-funktionen for at konvertere det aktuelle tidsstempel til det angivne format.
SELECT TO_CHAR(NOW() :: DATE, 'dd-mm-yyyy');
Minus- og intervaloperator
Du kan bruge minus (-) operatoren til at beregne forskellen mellem to datoer. Forespørgslen nedenfor returnerer f.eks. intervallet mellem det aktuelle tidsstempel og [Ordredato] fra tabellen Salgsordrer.
SELECT Orderdate,now() as currentdate, now()-Orderdate as Interval FROM SalesOrders where order_id=2;
Du kan også angive et interval for returnering af datoen efter en specificeret periode. For eksempel giver nedenstående SQL-forespørgsel følgende værdier.
- For fremtidig dato, angiv intervalværdi 2 timer fra det aktuelle tidsstempel: now() + interval '2 timer'
- For fremtidig dato skal du angive intervalværdien på 1 dag fra det aktuelle tidsstempel: now() + interval '1 dag'
- For tidligere dato, angiv intervalværdi et år fra det aktuelle tidsstempel: Now() – interval '1 år'
- Beregn et år efter datoen ud fra den værdi, der er gemt i kolonnen [Orderdate]: orderdate – interval ‘1 year’
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;
AGE() funktion
Funktionen AGE() returnerer datoforskellen i år, måneder og dage. Du kan bruge denne funktion til at beregne en persons alder.
Denne funktion accepterer to datoparametre og trækker den første datoværdi fra den anden.
Hvis du vender værdierne i ovenstående funktionsscript, returnerer det værdien i negativ.
I et andet eksempel, lad os sige, at nogen har fødselsdatoen 1990-07-01. Derfor kan en persons alder beregnes som nedenfor.
SELECT current_date, AGE(timestamp '1990-07-01') as EmpAge;
EXTRACT() funktion
Funktionen Extract() returnerer dag, uge, måned, år og kvartal fra den angivne datoværdi.
Udtræk et år
SELECT EXTRACT(YEAR FROM TIMESTAMP '2021-06-28 10:30:15') as year;
Udtræk en måned
SELECT EXTRACT(Month FROM TIMESTAMP '2021-06-28 10:30:15') as Month;
Udtræk en fjerdedel
SELECT EXTRACT(QUARTER FROM TIMESTAMP '2021-06-28 10:30:15') as QUARTER;
Udtrækning af ugedagen
SELECT EXTRACT(DOW FROM TIMESTAMP '2021-06-28 10:30:15') as DOW ;
Udtrækning af årets dag
SELECT EXTRACT(DOY FROM TIMESTAMP '2021-06-28 10:30:15') as DOY ;
Du kan også bruge EXTRACT()-funktionen i kombination med et INTERVAL. For eksempel angiver vi nedenfor intervallet som 7 år 9 måneder 20 dage 09 timer 12 minutter og 13 sekunder. Udtræksfunktionen returnerer de individuelle værdier.
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' ); ;
VED TIMEZONE
Nogle gange skal du konvertere tidsstemplet til en anden tidszone. For eksempel kan du gemme datoværdier i UTC (Universal Time Coordinator) og konvertere tidszonen efter behov.
SELECT * FROM pg_timezone_names;
For at kontrollere den aktuelle tidszone, brug VIS TIDZONE som vist nedenfor.
Du kan vælge den påkrævede tidszoneværdi fra pg_timezone_names og bruge AT TIME ZONE for at få output i henhold til den angivne tidszone.
SELECT '2021-06-28 07:09:19'::timestamp AT TIME ZONE 'America/Chicago';
På samme måde kan vi få forskellige tidszoneoutput ved at bruge 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';
Oversigt
Postgres-datotyper er essentielle og værdifulde, når du gemmer dato- og tidsstempler i næsten alle tabeller i en relationsdatabase. Du har brug for dem til forskellige formål såsom ordreindsættelse eller ved opdatering af tidsstempel, køb og salgsordrer, begivenhedsdetaljer, kunde- og medarbejderoplysninger og mere. Du kan bruge flere Postgres-funktioner til at konvertere en datotype til den påkrævede tidszone, format og specifikke oplysninger for at forenkle udtrækning og analyse af dine data.