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

Как да конвертирате поле за клеймо за време в int8? Или просто пуснете колоната и направете нова?

На първо място, целта е недефинирана, без да се изясни какво е това int8 ще представлява. Секунди от епохата? Милисекунди? Микросекунди? (Няма да има значение във вашия конкретен случай с всички NULL стойности, но следващият читател може да бъде подведен.)

След това в Postgres няма дефинирано предаване за timestamp --> bigint (по принцип поради същата причина). Имате нужда от валиден израз за USING клауза.

Ако приемем, че искате микросекунди тъй като това запазва оригиналната микросекунда резолюция на времевите клейма на Postgres, това ще свърши работата:

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

Трябва да се отбележи, че епохата на Postgres за времеви клейма започва в 2000-01-01 00:00:00 UTC, за разлика от епохата на UNIX, започваща в 1970-01-01 00:00:00 UTC. Но extract() връща UNIX епохата (която може да бъде преобразувана обратно в timestamptz с to_timestamp() ). Така че простото преобразуване на вътрешната стойност не би свършило работа.

За вашия конкретен случай (всички стойности NULL ), по-лесно е да използвате text като стъпало. Всеки тип може да бъде преобразуван от и към text (стига стойността да е съвместима).

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

И да, вероятно е по-евтино да преобразувате колоната на място, отколкото да я изпуснете и да я създадете отново. Въпреки че цялата колона е NULL, операцията е много евтина и в двата случая, тъй като няма действителни кортежни данни, само малко в NULL bitmap. Нито един от начините няма да задейства пренаписване на таблица.

Новодобавената колона винаги отива в края на списъка с колони, докато преобразуваната остава на мястото си. Зависи какво искате.

И накрая, не го правете изобщо. Типът данни timestamp (или timestamptz ) обикновено превъзхожда съхраняването на времева информация като общ bigint по множество начини. Вижте подробности в отговора на Laurenz!

Вижте:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. plpgsql функция:Връща редове от изглед, създаден от произволна таблица

  2. Обяснете предложението за изпълнение на условия JOIN спрямо LEFT JOIN и WHERE по-подробно

  3. Функцията PLpgSQL не връща съответстващи заглавия

  4. Разлика в производителността на CTE на Postgres срещу подзаявка. Защо?

  5. SQL грешка при опит за създаване на нов тригер