sql >> Database >  >> RDS >> PostgreSQL

Hoe een tijdstempelveld naar int8 te converteren? Of gewoon de kolom laten vallen en een nieuwe maken?

Allereerst is het doel niet gedefinieerd zonder duidelijk te maken wat die int8 gaat vertegenwoordigen. Seconden sinds het tijdperk? Milliseconden? Microseconden? (Het maakt in uw specifieke geval niet uit met alle NULL-waarden, maar de volgende lezer kan misleid zijn.)

Vervolgens is er in Postgres geen cast gedefinieerd voor timestamp --> bigint (eigenlijk om dezelfde reden). U hebt een geldige uitdrukking nodig voor de USING clausule.

Ervan uitgaande dat je microseconden wilt omdat dat de oorspronkelijke resolutie van microseconden van Postgres-tijdstempels behoudt, zal dit het werk doen:

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

Met name het Postgres-tijdperk voor tijdstempels begint op 01-01-2000 00:00:00 UTC, in tegenstelling tot het UNIX-tijdperk dat begint op 01-01-70 00:00:00 UTC. Maar extract() geeft het UNIX-tijdperk terug (die terug kan worden geconverteerd naar timestamptz met to_timestamp() ). Dus alleen de interne waarde converteren is niet voldoende.

Voor uw specifieke geval (alle waarden NULL ), is het eenvoudiger om text te gebruiken als springplank. Elk type kan worden gecast van en naar text (zolang de waarde compatibel is).

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

En ja, het is waarschijnlijk goedkoper om de kolom op zijn plaats te converteren dan om hem te laten vallen en opnieuw te maken. Hoewel de kolom helemaal NULL is, is de bewerking hoe dan ook erg goedkoop, omdat er geen echte tuple-gegevens zijn, alleen een beetje in de NULL-bitmap. Geen van beide manieren zal een tabel herschrijven activeren.

Een nieuw toegevoegde kolom gaat altijd naar het einde van de lijst met kolommen, terwijl de geconverteerde kolom op zijn plaats blijft. Hangt ervan af wat je wilt.

Tot slot, niet doen helemaal niet. Het gegevenstype timestamp (of timestamptz ) is doorgaans superieur aan het opslaan van tijdelijke informatie als generieke bigint op meerdere manieren. Zie details in het antwoord van Laurenz!

Zie:



  1. hoe verander je CSS-stijlen dynamisch met php/Mysql..ik wil thema's maken die uniek zijn voor elke gebruiker?

  2. Java ResultSet.getString() voor datumveld met 00:00:00.0

  3. Hoe kan ik MySQL-laadfout corrigeren?

  4. Oracle-listener configureren om extern te luisteren