In dit artikel gaan we in op Postgres-datums, de verschillende soorten datumgegevens, het gebruik en de functies.
Datum- en tijdstempels zijn handig voor gegevensanalyse en het opslaan van gegevens om te controleren wanneer een gebeurtenis daadwerkelijk heeft plaatsgevonden. Bijvoorbeeld wanneer u inkoop- en verkooporders, maand- of kwartaalinkomsten en meer heeft. Datumnotaties verschillen van land tot land, daarom kan het een ingewikkelde taak zijn voor mensen die nieuw zijn in databasebeheer en werken met datumkolommen. Het formaat of gegevenstype van de datumkolom moet altijd overeenkomen met de invoer van de gebruiker. Bovendien moet u de weergave van de datumnotatie converteren volgens de vereisten van uw gebruiker.
Postgres heeft verschillende ondersteunde gegevenstypen. Voordat u verder gaat, raad ik u aan de verschillende Postgres-gegevenstypen verkennen te raadplegen om deze in meer detail te begrijpen.
Postgres DATE-gegevenstype
Postgres gebruikt het gegevenstype DATE voor het opslaan van verschillende datums in de indeling JJJJ-MM-DD. Het gebruikt 4 bytes voor het opslaan van een datumwaarde in een kolom.
- Laagste datum:4713 v.Chr.
- Hoogste datum:5874897 v.Chr.
- Datumnotatie:JJJJ-MM-DD (bijv. 2021-01-01)
U kunt een Postgres-tabel ontwerpen met een DATE-kolom en het zoekwoord DEFAULT gebruiken CURRENT_DATE om de huidige systeemdatum als standaardwaarde in deze kolom te gebruiken.
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;
Zoals hieronder wordt weergegeven, voegt de SQL automatisch een waarde in voor de [OrderDate]-kolom met de huidige systeemdatum in de indeling JJJJ-MM-DD.
Postgres DATE-functies
We moeten vaak het datumformaat wijzigen of berekeningen uitvoeren op bestaande waarden die zijn opgeslagen in de Postgres-tabel. In India is het gebruikelijke datumformaat bijvoorbeeld DD-MM-YYYY. Daarom, wanneer een Indiase gebruiker de gegevens bekijkt, willen we waarschijnlijk dat hij de gegevens bekijkt in het formaat waarmee hij het meest vertrouwd is. In dit geval speelt SQL Functions een cruciale rol.
TO_CHAR() functie
Deze functie is handig om de uitvoer van een Postgres-datumwaarde in een gespecificeerd formaat te geven. Het accepteert de volgende twee parameters.
- Datum invoeren:dit is de datum die u naar een specifiek formaat wilt converteren.
- Datumformaat:hier specificeert u het nieuwe datumformaat.
De volgende query converteert bestaande datumwaarden die zijn opgeslagen in de tabel [SalesOrders] naar de indeling DD-MM-YYYY.
SELECT Orderdetails,OrderDate as ExistingDateformat, to_char(OrderDate,'DD-MM-YYYY') As NewDateFormat FROM SalesOrders;
De ondersteunde waarden in de to_char() functie zijn zoals hieronder getoond.
JJJJ | Jaar in vier cijfers |
JJJ | Laatste drie cijfers van een jaar |
JJ | Laatste twee cijfers van een jaar |
MAAND | Maandnaam in hoofdletters |
Maand | Maandnaam met de eerste letter als hoofdletter |
maand | Maandnaam in kleine letters |
MA/ma/ma | Afkorting van de maand in hoofdletters, eerste letter met hoofdletter en alle kleine letters, respectievelijk |
MM | Maandnummer (01-12) |
DAG/Dag/dag | Dagnaam in hoofdletters, eerste letter met hoofdletter en alle kleine letters, respectievelijk |
DDD | Dag van het jaar (001 tot 366) |
DD | Dag van de maand (01 tot 31) |
D | Dag van de week (zondag (1) tot zaterdag (7)) |
B | Week van de maand |
WW | Week van het jaar |
Een paar voorbeelden van verschillende datumnotaties worden gespecificeerd in de volgende 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()-functie
De functie Now() retourneert de huidige systeemtijdstempel (datum en tijd).
U kunt dubbele dubbele punten (::) specificeren om een DATETIME-waarde naar een DATE-waarde te casten.
U kunt TO_CHAR() en de Now()-functie combineren om de huidige tijdstempel naar het opgegeven formaat te converteren.
SELECT TO_CHAR(NOW() :: DATE, 'dd-mm-yyyy');
Minus- en intervaloperator
U kunt de min-operator (-) gebruiken om het verschil tussen twee datums te berekenen. De onderstaande query retourneert bijvoorbeeld het interval tussen de huidige tijdstempel en [Orderdatum] uit de tabel SalesOrders.
SELECT Orderdate,now() as currentdate, now()-Orderdate as Interval FROM SalesOrders where order_id=2;
U kunt ook een interval specificeren voor het retourneren van de datum na een bepaalde periode. De onderstaande SQL-query geeft bijvoorbeeld de volgende waarden.
- Geef voor toekomstige datum de intervalwaarde op 2 uur vanaf de huidige tijdstempel: now() + interval '2 uur'
- Geef voor toekomstige datum een intervalwaarde van 1 dag vanaf het huidige tijdstempel op: now() + interval '1 dag'
- Geef voor een datum in het verleden de intervalwaarde op één jaar vanaf de huidige tijdstempel op: Now() – interval '1 jaar'
- Bereken een jaar na de datum op basis van de waarde die is opgeslagen in de kolom [Besteldatum]: besteldatum – interval '1 jaar'
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() functie
De functie AGE() retourneert het datumverschil in jaren, maanden en dagen. U kunt deze functie gebruiken om de leeftijd van een persoon te berekenen.
Deze functie accepteert twee datumparameters en trekt de eerste datumwaarde af van de tweede.
Als u de waarden in het bovenstaande functiescript omkeert, wordt de waarde negatief geretourneerd.
Laten we in een ander voorbeeld zeggen dat iemand een geboortedatum heeft van 1990-07-01. Daarom kan de leeftijd van een persoon als volgt worden berekend.
SELECT current_date, AGE(timestamp '1990-07-01') as EmpAge;
EXTRACT() functie
De functie Extract() retourneert de dag, week, maand, jaar en kwartaal vanaf de opgegeven datumwaarde.
Een jaar extraheren
SELECT EXTRACT(YEAR FROM TIMESTAMP '2021-06-28 10:30:15') as year;
Een maand extraheren
SELECT EXTRACT(Month FROM TIMESTAMP '2021-06-28 10:30:15') as Month;
Een kwartaal extraheren
SELECT EXTRACT(QUARTER FROM TIMESTAMP '2021-06-28 10:30:15') as QUARTER;
De dag van de week extraheren
SELECT EXTRACT(DOW FROM TIMESTAMP '2021-06-28 10:30:15') as DOW ;
De dag van het jaar extraheren
SELECT EXTRACT(DOY FROM TIMESTAMP '2021-06-28 10:30:15') as DOY ;
U kunt de functie EXTRACT() ook gebruiken in combinatie met een INTERVAL. Hieronder specificeren we het interval bijvoorbeeld als 7 jaar 9 maand 20 dagen 09 uur 12 minuten en 13 seconden. De extract-functie retourneert de individuele waarden.
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' ); ;
IN TIJDZONE
Soms moet u de tijdstempel converteren naar een andere tijdzone. U kunt bijvoorbeeld datumwaarden opslaan in UTC (Universele tijdcoördinator) en de tijdzone naar behoefte converteren.
SELECT * FROM pg_timezone_names;
Om de huidige tijdzone te controleren, gebruik TOON TIJDZONE zoals hieronder getoond.
U kunt de vereiste tijdzonewaarde kiezen uit de pg_timezone_names en AT TIME ZONE gebruiken om de uitvoer per opgegeven tijdzone te krijgen.
SELECT '2021-06-28 07:09:19'::timestamp AT TIME ZONE 'America/Chicago';
Op dezelfde manier kunnen we verschillende tijdzone-uitgangen krijgen met 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';
Samenvatting
Postgres-datumtypen zijn essentieel en waardevol bij het opslaan van datum- en tijdstempels in bijna elke tabel van een relationele database. Je hebt ze nodig voor verschillende doeleinden, zoals het invoegen van bestellingen of bij het bijwerken van tijdstempels, in- en verkooporders, evenementdetails, klant- en werknemersinformatie en meer. U kunt meerdere Postgres-functies gebruiken om een datumtype om te zetten in de vereiste tijdzone, indeling en specifieke informatie om de extractie en analyse van uw gegevens te vereenvoudigen.