sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur konverterar man ett tidsstämpelfält till int8? Eller bara släppa kolumnen och skapa en ny?

Först och främst är målet odefinierat utan att klargöra vad som int8 kommer att representera. Sekunder sedan epoken? Millisekunder? Mikrosekunder? (Kommer inte att spela någon roll i ditt specifika fall med alla NULL-värden, men nästa läsare kan bli missriktad.)

Därefter, i Postgres finns det ingen cast definierad för timestamp --> bigint (i princip av samma anledning). Du behöver ett giltigt uttryck för USING klausul.

Förutsatt att du vill ha mikrosekunder eftersom det bevarar den ursprungliga mikrosekundupplösningen för Postgres tidsstämplar, kommer detta att göra jobbet:

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

Noterbart är att Postgres-epoken för tidsstämplar börjar 2000-01-01 00:00:00 UTC, till skillnad från UNIX-epoken som börjar 1970-01-01 00:00:00 UTC. Men extract() returnerar UNIX-epoken (som kan konverteras tillbaka till timestamptz med to_timestamp() ). Så att bara konvertera det interna värdet skulle inte fungera.

För ditt specifika fall (alla värden NULL ), är det enklare att använda text som språngbräda. Varje typ kan casta från och till text (så länge värdet är kompatibelt).

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

Och ja, det är förmodligen billigare att konvertera kolumnen på plats, än att släppa och återskapa den. Medan kolumnen är NULL, är operationen mycket billig i båda riktningarna, eftersom det inte finns några faktiska tupeldata, bara en bit i NULL-bitmappen. Inget av sätten kommer att utlösa en tabellomskrivning.

En nyligen tillagd kolumn går alltid till slutet av kolumnlistan, medan den konverterade stannar på plats. Beror på vad du vill ha.

Slutligen, gör inte det alls. Datatypen timestamp (eller timestamptz ) är vanligtvis överlägsen att lagra tidsinformation som generisk bigint på flera sätt. Se detaljer i Laurenz svar!

Se:



  1. Lösenordsautentisering misslyckas med komplext lösenord

  2. POSTGRESQL Referens till främmande nycklar Primära nycklar för två olika tabeller

  3. Hur man räknar antalet kolumner i en tabell med SQL?

  4. Finns det något sätt med MySQL att slå samman flera frågor till samma tabell för att få de olika resultaten i sina egna rader?