Методите за форматиране PostgreSQL включват полезна колекция от инструменти за превод на различни типове данни (дата / час, цяло число, с плаваща запетая, числови) във форматирани низове и превеждане на форматирани низове обратно в уникални типове данни. Оттук нататък понякога трябва да конвертираме и часови зони. Времето винаги се записва в UTC в PostgreSQL времеви марки за формата на данни за часовата зона, но се показва по подразбиране в браузъра, сесията или местното време на потребителя. Една от неговите помощни функции, на които разчитаме, е методът TO_CHAR (), който позволява времеви марки и времеви марки с часовата зона, наред с други форми, и ви позволява да подреждате парчетата от времева марка, както ви харесва. Клеймо за време, двойна точност, продължителността, число или числова стойност могат да бъдат преобразувани в низ с помощта на метода PostgreSQL TO_CHAR (). Изглежда, че има метод с един аргумент, 'to_timestamp', който взема аргумент с двойна точност и трансформира от Unix епоха в клеймо, използвайки часовата зона. Ще ви покажем как да направите нещо по този въпрос в тази публикация. Нека първо разгледаме по-отблизо to_char ().
Синтаксис:
Общият синтаксис за функцията to_char () е както следва:
>> To_char (израз, формат);Методът TO_CHAR () в PostgreSQL се нуждае от две твърдения:
- Израз: Клеймо за време, продължителност, число, двойна точност или числова стойност, която се превежда в низ според определен формат, може да се използва като изрази.
- Формат: Стилът, в който ще бъде показан изходният низ. Форматът може да бъде различен според вида на израза, напр.ж., номер, дата.
В PostgreSQL са налични два типа времеви клейма:
- Клеймо за време: без часова зона.
- Timestamptz: с часовата зона.
И тук е проблемът: стандартният формуляр за данни за времеви клеймо не знае за часовите зони. И това е необходимост от SQL (как би могло да се случи, изглежда отвъд). Нашият основен фокус е да научим to_Char () времева марка с часова зона. За да започнете работа по PostgreSQL с функцията 'to_char ()', отворете черупката на командния ред на PostgreSQL и доставете стойностите на параметрите за задължителния сървър, база данни, номер на порт, потребителско име и парола. Оставете тези съображения незапълнени, ако трябва да използвате параметрите по подразбиране, както е показано на изображението по-долу.
To_char () За String Number
За да разберете концепцията на функцията to_Char (), използвайки клеймо с времева зона, първо трябва да изпробвате примера с номера на низове. Така че имаме число '1897' и ще го преобразуваме в '9999.99 'формат, използвайки заявката по-долу. От изхода по-долу можете да видите, че номерът на низа е преобразуван в посочения формат.
>> ИЗБЕРЕТЕ to_char (1897, '9999.99 ');
Ето още една илюстрация за преобразуване. Този път преобразувахме число в различен формат, като в него има „запетая“. Символът „G“ ще се използва за задаване на запетая.
>> ИЗБЕРЕТЕ to_char (367.78, '9G999.99 ');
To_char Клеймо за време с TimeZone
За да разберем Timestamp с концепцията за часовата зона, нека разгледаме един прост пример. Да предположим, че сте в „Пакистан“, така че вашата часова зона трябва да е „PKT“ точно сега.
Пример 01:
Нека се опитаме да извлечем текущия клеймо в заявката SELECT, докато го конвертираме във формат Дата-час, както е показано в заявката по-долу. Терминът „TZ“ се използва за връщане на текущата часова зона. Резултатът показва деня, датата, часа и часовата зона.
>> ИЗБЕРЕТЕ to_char (CURRENT_TIMESTAMP, 'Day Mon dd, гггг HH12: MI AM (TZ)');
Нека променим часовата си зона на „Европа / Рим“.
>> SET TimeZone = 'Европа / Рим';
Ще получите различен час, дата и часова зона, когато опитате същата заявка SELECT, както е показано.
Пример 02:
Когато посочите TimeZone в заявката SELECT, тогава изходът няма да показва текущата часова зона според изхода по-долу.
>> ИЗБЕРЕТЕ to_char (CURRENT_TIMESTAMP В ЧАСОВАТА ЗОНА 'Азия / Йерусалим', 'yyyy HH12: MI AM (TZ)');
Пример 03:
Нека създадем бърза таблица с име „време“ с две полета. Единият е от типа TIMESTAMP, а другият е от типа TIMESTAMPTZ.
>> СЪЗДАЙТЕ ТАБЛИЦА време (без_часова зона TIMESTAMP, with_timezone TIMESTAMPTZ);
Сега нека проверим текущата часова зона, която използваме в нашата система, като използваме командата SHOW в черупката, както следва:
>> ПОКАЖЕТЕ часовата зона;
Сега трябва да вмъкнете текущите стойности на датата и часа на текущата часова зона, които сте използвали на вашето устройство в таблицата „време“, като използвате функцията „сега ()“, както е показано по-долу.
>> ВЪВЕДЕТЕ В СТОЙНОСТИ на времето (сега (), сега ());
Сега можете да извлечете записа от таблицата 'time', като използвате заявката SELECT, както е показано по-долу. Колоната 'without_timezone' показва текущата дата и час без часова зона, докато колоната 'with_timezone' показва местното време с часовата зона изцяло.
>> ИЗБЕРЕТЕ * ОТ време;
Нека променим часовата зона на „US / EASTERN“ от заявката по-долу.
>> ЗАДАВАНЕ НА ЧАСОВАТА ЗОНА ЗА СЕСИЯ 'US / EASTERN';
Сега да проверим отново таблицата. Ще видите как стойността на колоната 'with_timezone' е показана според часовата зона 'US / EASTERN', но стойността на 'without_timezone' е същата като преди.
>> ИЗБЕРЕТЕ * ОТ време;
Пример 04:
Нека имаме още няколко примера за метода to_char (). Да приемем същото по-горе таблица „време“. Ще преобразуваме стойността на колоната 'without_timezone' в низ, съставен от часове, минути, секунди и часова зона. Нека опитаме SELECT заявката, използвайки метода to_char () за преобразуване на стойността на колоната 'without_timezone'. В нашата заявка споменахме „TZ“, но тя няма да показва часовата зона, тъй като стойността на колоната не се състои от часовата зона. Посочената по-долу команда дава резултата:
>> ИЗБЕРЕТЕ to_char (без_часова зона, 'HH12: MI: SS TZ') ОТ време;
Сега нека опитаме същата заявка в случая на другата колона 'with_timezone', за да я преобразуваме в низ от часове, минути, секунди и часова зона. Този път ще покаже часовата зона с времето, като използва и заявката по-долу.
>> ИЗБЕРЕТЕ to_char (with_timezone, 'HH12: MI: SS TZ') ОТ времето;
Заключение:
Тъй като проблемът с / без часова зона засяга не само разделянето на таблици, препоръчвам ви да използвате типа на часовата зона, когато е възможно. Почти всички насоки обсъждаха как да се направи почистване, зависещо от времето в PostgreSQL, като се използват местни часове. Правилното, чувствително към часовата зона решение добавя малко усложнения, но може да ви спаси от проблеми в бъдеще.