I den här artikeln kommer vi att utforska Postgres-datum, de olika datumdatatyperna, användningarna och funktionerna.
Datum och tidsstämplar är användbara för dataanalys och lagring av data för att kontrollera när en händelse faktiskt ägde rum. Till exempel när du har inköps- och försäljningsorder, månads- eller kvartalsintäkter med mera. Datumformaten varierar mellan länder, därför kan det vara en komplicerad uppgift för dem som är nya inom databashantering och som arbetar med datumkolumner. Formatet eller datatypen för datumkolumnen ska alltid matcha användarens inmatning. Dessutom bör du konvertera datumformatet enligt användarens krav.
Postgres har en mängd olika datatyper som stöds. Innan du går vidare föreslår jag att du läser Utforska de olika Postgres-datatyperna för att förstå dessa mer i detalj.
Postgres DATE datatyp
Postgres använder datatypen DATUM för att lagra olika datum i formatet ÅÅÅÅ-MM-DD. Den använder 4 byte för att lagra ett datumvärde i en kolumn.
- Lägsta datum:4713 f.Kr.
- Högsta datum:5874897 f.Kr.
- Datumformat:ÅÅÅÅ-MM-DD (ex. 2021-01-01)
Du kan designa en Postgres-tabell med en DATUM-kolumn och använda sökordet DEFAULT CURRENT_DATE för att använda nuvarande systemdatum som standardvärde i den här kolumnen.
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 visas nedan infogar SQL automatiskt ett värde för kolumnen [OrderDate] med det aktuella systemdatumet i formatet ÅÅÅÅ-MM-DD.
Postgres DATE-funktioner
Vi behöver ofta ändra datumformatet eller göra beräkningar på befintliga värden lagrade i Postgres-tabellen. Till exempel i Indien är det vanliga datumformatet DD-MM-ÅÅÅÅ. Därför, när en indisk användare ser data, kommer vi troligen att vilja att han ska se data i det format han är mest bekant med. I det här fallet spelar SQL-funktioner en viktig roll.
TO_CHAR()-funktion
Den här funktionen är användbar för att ge utdata av ett Postgres-datumvärde i ett specificerat format. Den accepterar följande två parametrar.
- Inmatningsdatum:Detta är det datum som du vill konvertera till ett specifikt format.
- Datumformat:Det är här du anger det nya datumformatet.
Följande fråga konverterar befintliga datumvärden lagrade i tabellen [SalesOrders] till formatet DD-MM-ÅÅÅÅ.
SELECT Orderdetails,OrderDate as ExistingDateformat, to_char(OrderDate,'DD-MM-YYYY') As NewDateFormat FROM SalesOrders;
De värden som stöds i to_char()-funktionen är som visas nedan.
ÅÅÅÅ | Årtal med fyra siffror |
ÅÅÅ | De tre sista siffrorna i ett år |
ÅÅ | De två sista siffrorna i ett år |
MÅNAD | Månadsnamn med versaler |
Månad | Månadsnamn med den första bokstaven versal |
månad | Månadsnamn med små bokstäver |
MÅN/MÅN/MÅ | Månadsförkortning med versaler, första bokstaven versal respektive alla gemener |
MM | Månadsnummer (01-12) |
DAG/Dag/dag | Dagsnamn med versaler, första bokstaven versal respektive alla gemener |
DDD | Årets dag (001 till 366) |
DD | Dag i månaden (01 till 31) |
D | Veckodag (söndag (1) till lördag (7)) |
W | Månadens vecka |
WW | Årets vecka |
Några exempel på olika datumformat anges i följande 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()-funktionen
Funktionen Now() returnerar det aktuella systemets tidsstämpel (datum och tid).
Du kan ange dubbla kolon (::) för att kasta ett DATETIME-värde till ett DATE-värde.
Du kan kombinera TO_CHAR() och Now()-funktionen för att konvertera den aktuella tidsstämpeln till det angivna formatet.
SELECT TO_CHAR(NOW() :: DATE, 'dd-mm-yyyy');
Minus- och intervalloperator
Du kan använda minus (-) operatorn för att beräkna skillnaden mellan två datum. Till exempel returnerar frågan nedan intervallet mellan den aktuella tidsstämpeln och [Orderdatum] från tabellen SalesOrders.
SELECT Orderdate,now() as currentdate, now()-Orderdate as Interval FROM SalesOrders where order_id=2;
Du kan också ange ett intervall för att returnera datumet efter en angiven period. Till exempel ger SQL-frågan nedan följande värden.
- För framtida datum, ange intervallvärdet 2 timmar från den aktuella tidsstämpeln: now() + intervall '2 timmar'
- För framtida datum, ange ett intervallvärde på 1 dag från den aktuella tidsstämpeln: now() + intervall '1 day'
- För tidigare datum, ange intervallvärdet ett år från den aktuella tidsstämpeln: Now() – intervall '1 år'
- Beräkna ett år efter datumet från värdet som lagrats i kolumnen [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() returnerar datumskillnaden i år, månader och dagar. Du kan använda den här funktionen för att beräkna en persons ålder.
Denna funktion accepterar två datumparametrar och subtraherar det första datumvärdet från det andra.
Om du vänder på värdena i funktionsskriptet ovan returnerar det värdet i negativt värde.
I ett annat exempel, låt oss säga att någon har födelsedatumet 1990-07-01. Därför kan en persons ålder beräknas enligt nedan.
SELECT current_date, AGE(timestamp '1990-07-01') as EmpAge;
EXTRACT() funktion
Funktionen Extract() returnerar dag, vecka, månad, år och kvartal från det angivna datumvärdet.
Extrahera ett år
SELECT EXTRACT(YEAR FROM TIMESTAMP '2021-06-28 10:30:15') as year;
Extrahera en månad
SELECT EXTRACT(Month FROM TIMESTAMP '2021-06-28 10:30:15') as Month;
Extrahera en fjärdedel
SELECT EXTRACT(QUARTER FROM TIMESTAMP '2021-06-28 10:30:15') as QUARTER;
Extrahera veckodagen
SELECT EXTRACT(DOW FROM TIMESTAMP '2021-06-28 10:30:15') as DOW ;
Extrahera årets dag
SELECT EXTRACT(DOY FROM TIMESTAMP '2021-06-28 10:30:15') as DOY ;
Du kan också använda EXTRACT()-funktionen i kombination med ett INTERVAL. Till exempel nedan anger vi intervallet som 7 år 9 månader 20 dagar 09 timmar 12 minuter och 13 sekunder. Extrahera-funktionen returnerar de individuella värdena.
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' ); ;
VID TIDZON
Ibland måste du konvertera tidsstämpeln till en annan tidszon. Du kan till exempel lagra datumvärden i UTC (Universal Time Coordinator) och konvertera tidszonen efter behov.
SELECT * FROM pg_timezone_names;
För att kontrollera den aktuella tidszonen, använd VISA TIDZON som visas nedan.
Du kan välja önskat tidszonvärde från pg_timezone_names och använda AT TIME ZONE för att få utdata per den angivna tidszonen.
SELECT '2021-06-28 07:09:19'::timestamp AT TIME ZONE 'America/Chicago';
På liknande sätt kan vi få olika tidszonsutgångar med 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';
Sammanfattning
Postgres datumtyper är viktiga och värdefulla när du lagrar datum och tidsstämplar i nästan varje tabell i en relationsdatabas. Du behöver dem för olika ändamål såsom orderinförande eller vid uppdatering av tidsstämpel, köp och försäljningsorder, händelsedetaljer, kund- och anställdinformation med mera. Du kan använda flera Postgres-funktioner för att konvertera en datumtyp till önskad tidszon, format och specifik information för att förenkla extraheringen och analysen av dina data.