PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak przekonwertować pole znacznika czasu na int8? A może po prostu upuść kolumnę i utwórz nową?

Przede wszystkim cel jest niezdefiniowany bez wyjaśnienia, co to int8 będzie reprezentować. Sekundy od epoki? Milisekundy? Mikrosekundy? (Nie ma to znaczenia w twoim konkretnym przypadku ze wszystkimi wartościami NULL, ale następny czytelnik może się mylić.)

Następnie w Postgresie nie ma zdefiniowanego rzutowania dla timestamp --> bigint (w zasadzie z tego samego powodu). Potrzebujesz prawidłowego wyrażenia dla USING klauzula.

Zakładając, że potrzebujesz mikrosekund ponieważ zachowuje to oryginalną mikrosekundową rozdzielczość znaczników czasu Postgres, to wykona zadanie:

ALTER TABLE public.new_ambient_data
   ALTER COLUMN sensor_date TYPE int8 USING (extract(epoch FROM sensor_date)*1000000)::int8;

Warto zauważyć, że epoka Postgres dla znaczników czasu zaczyna się od 2000-01-01 00:00:00 UTC, w przeciwieństwie do epoki UNIX, która zaczyna się od 1970-01-01 00:00:00 UTC. Ale extract() zwraca epokę UNIX (którą można przekonwertować z powrotem na timestamptz z to_timestamp() ). Więc sama konwersja wartości wewnętrznej nie wystarczy.

W konkretnym przypadku (wszystkie wartości NULL ), łatwiej jest użyć text jako odskocznię. Każdy typ może być rzutowany z i do text (o ile wartość jest zgodna).

ALTER TABLE public.new_ambient_data
   ALTER COLUMN sensor_date TYPE int8 USING sensor_date::text::int8;

I tak, prawdopodobnie taniej jest przekonwertować kolumnę w miejscu, niż upuścić i odtworzyć ją. Chociaż cała kolumna ma wartość NULL, operacja jest bardzo tania, ponieważ nie ma rzeczywistych danych krotki, tylko bit w bitmapie NULL. Żaden sposób nie spowoduje przepisania tabeli.

Nowo dodana kolumna zawsze trafia na koniec listy kolumn, podczas gdy przekonwertowana pozostaje na swoim miejscu. Zależy od tego, czego chcesz.

Wreszcie nie rób tego w ogóle. Typ danych timestamp (lub timestamp ) jest zazwyczaj lepsze od przechowywania informacji tymczasowych jako ogólnych bigint na wiele sposobów. Zobacz szczegóły w odpowiedzi Laurenza!

Zobacz:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zmapować tablicę PostgreSQL za pomocą Hibernate?

  2. usuń słowa stop bez rdzenia w postgresql

  3. Hibernate, Postgresql:Kolumna x jest typu oid, ale wyrażenie jest typu byte

  4. Konwertuj kolumnę bajtową na OID, zachowując wartości

  5. SQL pobiera dane z BEGIN; ...; KONIEC; blok w pytonie