На първо място, целта е недефинирана, без да се изясни какво е това 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!
Вижте:
- Игнориране на времето зони изцяло в Rails и PostgreSQL
- Как да получа датата и часа от времевия печат в заявката за избор на PostgreSQL?
- Как да закръгля стойността на милисекунди от timestamp(0) в PostgreSQL?