sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan konverteres et tidsstempelfelt til int8? Eller bare slip kolonnen og lave en ny?

Først og fremmest er målet udefineret uden at opklare, hvad det int8 kommer til at repræsentere. Sekunder siden epoken? Millisekunder? Mikrosekunder? (Vil ikke betyde noget i dit særlige tilfælde med alle NULL-værdier, men den næste læser kan være forkert.)

Dernæst i Postgres er der ingen cast defineret for timestamp --> bigint (grundlæggende af samme grund). Du skal bruge et gyldigt udtryk for USING klausul.

Forudsat at du vil have mikrosekunder fordi det bevarer den originale mikrosekundsopløsning af Postgres tidsstempler, vil dette gøre jobbet:

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

Det er bemærkelsesværdigt, at Postgres-epoken for tidsstempler starter ved 2000-01-01 00:00:00 UTC, i modsætning til UNIX-epoken, der starter ved 1970-01-01 00:00:00 UTC. Men extract() returnerer UNIX-epoken (som kan konverteres tilbage til timestamptz med to_timestamp() ). Så bare at konvertere den interne værdi ville ikke betale sig.

Til dit særlige tilfælde (alle værdier NULL ), er det nemmere at bruge text som trædesten. Hver type kan castes fra og til text (så længe værdien er kompatibel).

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

Og ja, det er nok billigere at konvertere søjlen på plads, end at droppe og genskabe den. Mens kolonnen er NULL, er operationen meget billig på begge måder, da der ikke er nogen egentlige tuple-data, kun en smule i NULL-bitmap. Ingen af ​​måderne vil udløse en tabelomskrivning.

En ny tilføjet kolonne går altid til slutningen af ​​kolonnelisten, mens den konverterede forbliver på plads. Afhænger af, hvad du ønsker.

Endelig gør det ikke overhovedet. Datatypen timestamp (eller timestamptz ) er typisk bedre end lagring af tidsmæssig information som generisk bigint på flere måder. Se detaljer i Laurenz' svar!

Se:



  1. Sådan forbedrer du forespørgselsydeevne med mange JOINs

  2. php echo første række vent/søv derefter echo anden række

  3. Hvordan fungerer Hibernate Batch-indsættelse?

  4. ude af stand til at slippe fremmednøglen