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

PostgreSQL/JDBC и TIMESTAMP срещу TIMESTAMPTZ

Обикновено използвайте TIMESTAMPTZ

Ето съвет от Дейвид Е. Уилър, експерт на Postgres, в публикация в блог, чието заглавие казва всичко:
Винаги използвайте TIMESTAMP С ЧАСОВА ЗОНА (TIMESTAMPTZ)

Ако проследявате действителни моменти, конкретни точки от времевата линия, използвайте TIMESTAMP WITH TIME ZONE .

Едно изключение:Разделяне

Единственото изключение на Wheeler е при разделяне на времеви клейма поради технически ограничения. Рядко изключение за повечето от нас.

За информация относно разделянето вижте doc и вижте Wiki .

Погрешно название

Имената на типовете данни timestamp with time zone и timestamp without time zone са погрешни имена. И в и двете случаите стойността за дата-час се съхранява в UTC (без изместване на часовата зона). Прочетете предишното изречение отново. UTC, винаги. Фразата „с часова зона“ означава „с внимание към часовата зона“, а не „съхранявайте часовата зона заедно с тази стойност“. Разликата между типовете е дали трябва да се приложи някаква часова зона по време на съхранение (INSERT или UPDATE) или извличане (SELECT заявка). (Това поведение е описано за Postgres -- другите бази данни варират много в това отношение.)

По-точно, трябва да се каже, че TIMESTAMP WITHOUT TIME ZONE съхранява стойности за дата-час без часова зона. Но без никаква препратка към времева рамка, всеки, който гледа тези данни, ще трябва да приеме (надявам се, моля?), че стойностите са UTC. Но отново, спорно, тъй като почти никога не трябва да използвате този тип.

Прочетете документа внимателно и експериментирайте малко, за да изясните разбирането си.

Незониран

Ако искате да съхраните общата идея за възможно време, а не за конкретен момент, използвайте другия тип, TIMESTAMP WITHOUT TIME ZONE .

Например Коледа започва тази година в първия момент на 25 декември 2017 г. Това би било 2017-12-25T 00:00:00 без индикатор за часова зона или отместване спрямо UTC. Тази стойност е само бегла представа за възможни моменти. Няма смисъл, докато не приложим часова зона (или отместване). Затова съхраняваме това, като използваме TIMESTAMP WITHOUT TIME ZONE .

Елфите работят в отдела за логистика на специални събития на Дядо Коледа прилагат часовите зони като част от процеса на планиране. Най-ранната часова зона в момента е Pacific/Kiribati , 14 часа преди UTC. Елфите планират първото пристигане на Дядо Коледа там. Елфите планират полетен план, отвеждащ елените до други часови зони, където полунощ идва малко след това, като Pacific/Auckland . Те продължават да вървят на запад, когато настъпи полунощ във всяка зона. Часове по-късно в Asia/Kolkata , още по-късно в Europe/Paris , още часове по-късно в America/Montreal и така нататък.

Всеки от тези конкретни моменти на доставка ще бъде записан от елфите с помощта на WITH TIME ZONE , докато тази обща идея за Коледа би била съхранена като WITHOUT TIME ZONE .

Друга употреба в бизнес приложения за WITHOUT TIME ZONE насрочва срещи по-далеч от няколко седмици. Политиците по света имат необяснима пристрастност към бъркане с часовника и предефиниране на правилата за часовата зона. Те се присъединяват към лятното часово време (DST), напускат лятното часово време, започват лятното часово време на друга дата или завършват лятното часово време на друга дата, или изместват часовниците си с 15 минути или половин час. Всичко това е направено през последните няколко години от Турция, Съединените щати, Русия, Венецуела и други.

Политиците често правят тези промени с малко предварително предупреждение. Така че, ако насрочвате час за зъболекар за шест месеца в 13:00, това вероятно трябва да се съхрани като TIMESTAMP WITHOUT TIME ZONE или в противен случай политиците може ефективно да променят срещата ви на обяд, или 14:00, или 13:30.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да върна динамичния брой колони във функцията?

  2. Грешка:Ключ ... не присъства в таблицата

  3. Внедряване на постепенни клиентски актуализации с версии на редове в Postgres

  4. Как да прехвърля производствена база данни към етап на Heroku с помощта на pgbackups? Получаване на грешка

  5. JDBC връзката, създадена в Eclipse, не работи както трябва