В тази статия ще разгледаме датите в Postgres, различните типове данни за дата, употреби и функции.
Печатите за дата и време са полезни за анализ на данни и съхраняване на данни за проверка кога действително се е случило събитие. Например, когато имате поръчки за покупка и продажба, месечни или тримесечни приходи и др. Форматите на датите варират в различните държави, следователно това може да бъде сложна задача за тези, които са нови в управлението на бази данни и работят с колони за дати. Форматът или типът на данните на колоната за дата винаги трябва да съвпадат с въвеждането на потребителя. Освен това трябва да преобразувате показвания формат на датата според изискванията на вашия потребител.
Postgres има разнообразие от поддържани типове данни. Преди да продължите по-нататък, ви предлагам да разгледате Разглеждане на различните типове данни на Postgres за да ги разберете по-подробно.
Тип данни на Postgres DATE
Postgres използва типа данни DATE за съхраняване на различни дати във формат ГГГГ-ММ-ДД. Той използва 4 байта за съхраняване на стойност за дата в колона.
- Най-ниска дата:4713 г. пр.н.е.
- Най-висока дата:5874897 г. пр.н.е.
- Формат на датата:ГГГГ-ММ-ДД (напр. 2021-01-01)
Можете да проектирате таблица на Postgres с колона DATE и да използвате ключовата дума DEFAULT ТЕКУЩА_ДАТА за да използвате текущата системна дата като стойност по подразбиране в тази колона.
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;
Както е показано по-долу, SQL вмъква стойност за колоната [OrderDate] автоматично с текущата системна дата във формат ГГГГ-ММ-ДД.
Функции на Postgres DATE
Често се налага да променяме формата на датата или да правим изчисления на съществуващи стойности, съхранени в таблицата на Postgres. Например в Индия обичайният формат на датата е ДД-ММ-ГГГГ. Следователно, когато индийски потребител преглежда данните, вероятно ще искаме той да преглежда данните във формата, с който е най-запознат. В този случай SQL функциите играят жизненоважна роля.
Функция TO_CHAR()
Тази функция е полезна за предоставяне на изхода на стойност за дата на Postgres в определен формат. Той приема следните два параметъра.
- Въведена дата:Това е датата, която искате да конвертирате в конкретен формат.
- Формат на датата:Тук задавате новия формат на датата.
Следната заявка преобразува съществуващите стойности за дати, съхранени в таблицата [SalesOrders], във формат ДД-ММ-ГГГГ.
SELECT Orderdetails,OrderDate as ExistingDateformat, to_char(OrderDate,'DD-MM-YYYY') As NewDateFormat FROM SalesOrders;
Поддържаните стойности във функцията to_char() са както е показано по-долу.
ГГГГ | Година с четири цифри |
ГГГ | Последните три цифри на годината |
ГГ | Последните две цифри на годината |
МЕСЕЦ | Име на месеца с главни букви |
Месец | Име на месеца с главна буква |
месец | Име на месеца с малки букви |
ПН/Пн/мес | Съкращение за месец съответно с главни, първа буква и всички малки букви |
MM | Номер на месец (01-12) |
ДЕН/Ден/ден | Име на деня съответно с главни, първа буква и всички малки букви |
DDD | Ден от годината (001 до 366) |
DD | Ден от месеца (01 до 31) |
D | Ден от седмицата (неделя (1) до събота (7)) |
Ш | Седмица на месеца |
WW | Седмица на годината |
Няколко примера за различни формати на дата са посочени в следния 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()
Функцията Now() връща текущата системна дата (дата и час).
Можете да посочите двойни двоеточия (::), за да прехвърлите стойност DATETIME към стойност DATE.
Можете да комбинирате TO_CHAR() и функцията Now(), за да преобразувате текущото времеви печат в посочения формат.
SELECT TO_CHAR(NOW() :: DATE, 'dd-mm-yyyy');
Оператор за минус и интервал
Можете да използвате оператора минус (-), за да изчислите разликата между две дати. Например, заявката по-долу връща интервала между текущата времева марка и [Orderdate] от таблицата SalesOrders.
SELECT Orderdate,now() as currentdate, now()-Orderdate as Interval FROM SalesOrders where order_id=2;
Можете също да посочите интервал за връщане на датата след определен период. Например, долната SQL заявка дава следните стойности.
- За бъдеща дата посочете стойност на интервала 2 часа от текущата времева марка: now() + интервал „2 часа“
- За бъдеща дата посочете стойност на интервала от 1 ден от текущата времева марка: now() + интервал „1 ден“
- За минала дата посочете стойност на интервала една година от текущото времеви печат: Сега() – интервал „1 година“
- Изчислете една година след датата от стойността, съхранена в колоната [Orderdate]: orderdate – интервал „1 година“
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()
Функцията AGE() връща разликата в датата в години, месеци и дни. Можете да използвате тази функция, за да изчислите възрастта на човек.
Тази функция приема два параметъра за дата и изважда първата стойност на датата от втората.
Ако обърнете стойностите в горния функционален скрипт, той връща стойността в отрицателна стойност.
В друг пример, да кажем, че някой има рождена дата 1990-07-01. Следователно възрастта на дадено лице може да се изчисли, както следва.
SELECT current_date, AGE(timestamp '1990-07-01') as EmpAge;
Функция EXTRACT()
Функцията Extract() връща деня, седмицата, месеца, годината и тримесечието от посочената стойност за дата.
Извличане на година
SELECT EXTRACT(YEAR FROM TIMESTAMP '2021-06-28 10:30:15') as year;
Извличане на месец
SELECT EXTRACT(Month FROM TIMESTAMP '2021-06-28 10:30:15') as Month;
Извлечете една четвърт
SELECT EXTRACT(QUARTER FROM TIMESTAMP '2021-06-28 10:30:15') as QUARTER;
Извличане на деня от седмицата
SELECT EXTRACT(DOW FROM TIMESTAMP '2021-06-28 10:30:15') as DOW ;
Извличане на деня от годината
SELECT EXTRACT(DOY FROM TIMESTAMP '2021-06-28 10:30:15') as DOY ;
Можете също да използвате функцията EXTRACT() в комбинация с INTERVAL. Например, по-долу посочваме интервала като 7 години 9 месец 20 дни 09 часа 12 минути и 13 секунди. Функцията за извличане връща отделните стойности.
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' ); ;
В ЧАСОВА ЗОНА
Понякога трябва да преобразувате времевата марка в друга часова зона. Например, можете да съхранявате стойности на датите в UTC (универсален координатор на времето) и да конвертирате часовата зона според изискванията.
SELECT * FROM pg_timezone_names;
За да проверите текущата часова зона, използвайте SHOW TIMEZONE, както е показано по-долу.
Можете да изберете необходимата стойност на часовата зона от pg_timezone_names и да използвате AT TIME ZONE за получаване на изхода според определената часова зона.
SELECT '2021-06-28 07:09:19'::timestamp AT TIME ZONE 'America/Chicago';
По същия начин можем да получим различни резултати за часови зони, използвайки 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';
Резюме
Типовете дати на Postgres са от съществено значение и са ценни при съхраняване на дата и времеви печати в почти всяка таблица на релационна база данни. Нуждаете се от тях за различни цели, като вмъкване на поръчка или при актуализиране на времеви печат, поръчки за покупки и продажби, подробности за събития, информация за клиенти и служители и др. Можете да използвате множество функции на Postgres, за да конвертирате тип дата в необходимата часова зона, формат и специфична информация, за да опростите извличането и анализа на вашите данни.