2012-11-14 42 views
5

Trong đường ray, tôi đã tạo một cột chuỗi gọi là open_time nhưng sau đó tôi nhận ra rằng tôi nên sử dụng kiểu datetime. Tôi đã làmThay đổi loại cột từ ký tự thay đổi thành dấu thời gian không có múi giờ trong PostgreSQL

change_column :polls, :open_time, :datetime 

Nhưng nó nói:

PG::Error: ERROR: column "open_time" cannot be cast to type timestamp without time zone 
: ALTER TABLE "polls" ALTER COLUMN "open_time" TYPE timestamp 

Nếu tôi chỉ cần thả cột chuỗi và thêm cột datetime mới, tôi sẽ mất các dữ liệu được lưu trữ trong cột chuỗi. Ngoài ra, trong PostgreSQL tôi thêm cột:

ALTER TABLE polls ADD COLUMN published_time timestamp; 

Sau đó, tôi đã cố gắng để lấy dữ liệu từ cột chuỗi như:

UPDATE polls SET published_time = strToTimeStamp(open_time); 

Vì vậy, câu hỏi của tôi là được có bất kỳ chức năng tôi có thể sử dụng như là strToTimeStamp rằng có thể chuyển đổi loại ký tự khác nhau thành dấu thời gian không có loại múi giờ?

+2

Bạn muốn 'ALTER COLUMN ... USING'. Xem ví dụ http://stackoverflow.com/search?q=%5Bpostgresql%5D%20ALTER%20COLUMN%20using (gần-dup) –

Trả lời

5

.. có bất kỳ chức năng nào tôi có thể sử dụng làm strToTimeStamp có thể chuyển đổi loại ký tự thay đổi thành dấu thời gian không có loại múi giờ không?

Sử dụng to_timestamp() để thay đổi loại dữ liệu của cột tại chỗ.

ALTER TABLE tbl ALTER COLUMN col TYPE timestamp 
USING to_timestamp(col, '<your pattern here>'); 

More dưới những câu hỏi này rất giống nhau:
Alter character field to date
Cast varchar type to date

-3

Đừng nghĩ rằng bạn có thể làm điều đó, vì nó bị giới hạn bởi khả năng của cơ sở dữ liệu. Ý tưởng này được thực hiện như sau:

  • tạo một cột mới với một cái tên khác
  • Sao chép qua các nội dung cột sau khi số liệu chuyển đổi cho mỗi hàng
  • Thả col gốc
  • Đổi tên col mới để để tên gốc ban đầu

Các bước này có thể được đặt vào cùng một tệp di chuyển và giữ chúng thành giao dịch trong trường hợp.

+0

Tất nhiên là có thể, khả năng của DB cho phép nó. –

+0

Bạn nói đúng, sử dụng DB capailibity có thể làm điều đó, nhưng đó là về cách sử dụng đường ray. Thậm chí chúng ta có thể sử dụng SQL thô để thay đổi cột cơ sở dữ liệu trong quá trình di chuyển đường ray, bằng cách nào đó nó không phải là một thực hành tốt trừ khi chúng ta hiểu rõ dự án đang tập trung vào một cơ sở dữ liệu nào đó. –

Các vấn đề liên quan