A Rails migration to turn a \"deleted_at\" time column to a datetime column failed. Any ideas on how to solve this? It\'s a fresh install of Postgres if that is relevant.
<You can't alter a field's type from time to timestamp ("datetime"), because the values couldn't be converted -- the database doesn't know the date.
You can, however, drop and re-create the column:
ALTER TABLE products DROP COLUMN deleted_at;
ALTER TABLE products ADD COLUMN deleted_at timestamp;
Or if this field was set to NOT NULL, you should instead do:
ALTER TABLE products ADD COLUMN deleted_at timestamp NOT NULL;
But if you insist on retaining fake values in this table like Sean, you can use ALTER...TYPE...USING like this:
ALTER TABLE products ALTER COLUMN deleted_at TYPE timestamp USING
CASE WHEN deleted_at IS NOT NULL THEN timestamp '1970-01-01 00:00:00' END;
-- Or:
ALTER TABLE products ALTER COLUMN deleted_at
TYPE timestamp USING date '1970-01-01' + deleted_at;
In Rails this would look something like
class ChangeStatusUpdatedAtToDateTime < ActiveRecord::Migration
def up
remove_column :bookings, :status_updated_at
add_column :bookings, :status_updated_at, :datetime
end
def down
remove_column :bookings, :status_updated_at
add_column :bookings, :status_updated_at, :time
end
end