PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как работи функцията timezone() в PostgreSQL

В PostgreSQL можете да използвате timezone() функция за преобразуване на времева марка в друга часова зона.

Синтаксис

Синтаксисът е така:

timezone(zone, timestamp) 

Където zone е часовата зона, за която искате timestamp аргумент, към който да се преобразува.

Резултатът, който ще получите, ще зависи от това дали първоначалната стойност на времевия клей включва часова зона или не (и каква е тази стойност).

Пример 1 – Когато оригиналното клеймо за време ВКЛЮЧВА часовата зона

Ето какво се случва, когато оригиналната времева марка включва часовата зона.

SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00+00'); 

Резултат:

25.10.2020 04:00:00

Когато оригиналната времева марка включва часовата зона, timezone() функцията измества първоначалната стойност на времевия клей към определената часова зона и връща стойността без часова зона.

Ето какво се случва, ако сменя часовата зона на въведената времева марка.

SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00+01'); 

Резултат:

25.10.2020 03:00:00

Полученото времеви печат се измества според въведената часова зона.

И ако посочите timestamp with time zone , но оригиналното клеймо за време всъщност не включва часова зона, тогава първоначалната стойност на времевата марка се измества към местната часова зона.

SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00'); 

Резултат:

24.10.2020 18:00:00

В този случай получената времева марка е върната шест часа назад. Това означава, че моята местна часова зона е шест часа по-напред от Индия/Мавриций.

Можем да видим изместването на часовата зона, което е използвано, като изберем директно входната стойност.

SELECT timestamp with time zone '2020-10-25 00:00:00'; 

Резултат:

25.10.2020 00:00:00+10

Пример 2 – Когато оригиналното клеймо за време НЕ включва часовата зона

Ето какво се случва, когато оригиналното времеви печат не включва часова зона.

SELECT timezone('Indian/Mauritius', timestamp without time zone '2020-10-25 00:00:00'); 

Резултат:

25.10.2020 06:00:00+10

Когато оригиналната времева марка не включва часова зона, резултатът се показва с помощта на текущата TimeZone настройка и отместването на часовата зона се добавя.

Това се прилага всеки път, когато посочите timestamp without time zone , дори ако клеймото за време всъщност съдържа изместване на часовата зона.

SELECT timezone('Indian/Mauritius', timestamp without time zone '2020-10-25 00:00:00+12'); 

Резултат:

25.10.2020 06:00:00+10

Това може да се очаква, защото ако избера само timestamp without time zone стойност, това получавам:

SELECT timestamp without time zone '2020-10-25 00:00:00+12'; 

Резултат:

25.10.2020 00:00:00

Пример 3 – клеймо за местно време

Нека използваме localtimestamp функция за стартиране на сравнение между текущата времева марка в моята собствена часова зона и получената времева марка след използване на timezone() функция, за да го преобразувате в друга часова зона.

\x
SELECT 
  localtimestamp,
  timezone('Indian/Mauritius', localtimestamp); 

Резултат:

местен час | 2020-07-08 15:42:04.965221часова зона | 2020-07-08 21:42:04.965221+10

localtimestamp функцията връща клеймо за време тип данни, който идва с имплицитно „без часова зона“. С други думи, клеймо за време и клеймо за време без часова зона са едно и също нещо.

Както беше показано по-рано, когато не е посочена часова зона в оригиналната времева марка, текущата TimeZone настройката се използва и се добавя към резултата. И така, това получаваме, когато използваме localtimestamp .

Между другото, в този пример използвах \x за да покажете резултата с помощта на разширен дисплей/вертикален изход, само за да го улесните за четене.

Пример 4 – текуща_времева марка

Сега нека използваме current_timestamp функция вместо localtimestamp .

SELECT 
  current_timestamp,
  timezone('Indian/Mauritius', current_timestamp); 

Резултат (с помощта на вертикален изход):

текуща_времева марка | 2020-07-08 15:42:04.335669+10часова зона | 2020-07-08 09:42:04.335669

Този път отместването на часовата зона е добавено към оригиналната времева марка и timezone() резултатът вече не го включва.

Получаваме този резултат, защото current_timestamp функцията връща клеймо за време с часова зона тип данни.

Пример 5 – Използване на времеви стойности

timezone() функцията работи и с time стойности (time with time zone и time without time zone ).

Въпреки това, когато го използвате в time with time zone стойности, изместването на часовата зона се добавя към резултата.

SELECT 
  timezone('Indian/Mauritius', time with time zone '00:00:00+00'),
  timezone('Indian/Mauritius', time with time zone '00:00:00+01'),
  timezone('Indian/Mauritius', time with time zone '00:00:00'); 

Резултат (с помощта на вертикален изход):

<предварителна>часова зона | 04:00:00+04часова зона | 03:00:00+04часова зона | 18:00:00+04

И за пълнота, ето същите тези стойности, използващи time without time zone тип данни.

SELECT 
  timezone('Indian/Mauritius', time without time zone '00:00:00+00'),
  timezone('Indian/Mauritius', time without time zone '00:00:00+01'),
  timezone('Indian/Mauritius', time without time zone '00:00:00'); 

Резултат (с помощта на вертикален изход):

<предварителна>часова зона | 18:00:00+04часова зона | 18:00:00+04часова зона | 18:00:00+04

Проверете местната часова зона

Ако искате да проверите собствената си местна часова зона, стартирайте SHOW TIMEZONE .

Ето какво получавам, когато изпълня тази команда.

SHOW TIMEZONE; 

Резултат:

Австралия/Бризбейн

Проверете отместването на часовата зона

Въоръжен с горните познания, сега мога да проверя двете измествания на часовата зона, като задам pg_timezone_names преглед.

SELECT * 
FROM pg_timezone_names
WHERE name = 'Indian/Mauritius'
OR name = 'Australia/Brisbane'; 

Резултат (с помощта на вертикален изход):

<предварително име | съкращение | utc_offset | is_dst--------------------+-------+------------+------ --Индийски/Мавриций | +04 | 04:00:00 | fАвстралия/Бризбейн | AEST | 10:00:00 | е

Вижте Връщане на списък с часови зони, поддържани от PostgreSQL за повече опции и примери за връщане на часовата зона в Postgres.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Симулирате CREATE DATABASE, АКО НЕ СЪЩЕСТВУВА за PostgreSQL?

  2. Поправяне на повредена база данни postgresql

  3. SequelizeConnectionError:самоподписан сертификат

  4. При неуспешно инсталиране на pg gem, mkmf.rb не може да намери заглавни файлове за ruby ​​(Mac OSX 10.6.5)

  5. 3 начина за изброяване на всички функции в PostgreSQL