2012-11-14 10 views
5

W szynach utworzyłem kolumnę ciągów o nazwie open_time, ale potem zdałem sobie sprawę, że powinienem użyć typu daty i czasu. ZrobiłemZmienia typ kolumny od znaku zmieniającego się na znacznik czasu bez strefy czasowej w PostgreSQL

change_column :polls, :open_time, :datetime 

Ale powiedział:

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

Gdybym tylko kropla kolumnę ciąg i dodać nową kolumnę datetime, stracę dane przechowywane w kolumnie strun. Alternatywnie, w PostgreSQL dodać kolumnę:

ALTER TABLE polls ADD COLUMN published_time timestamp; 

Potem starałem się uzyskać dane z kolumny ciąg jak:

UPDATE polls SET published_time = strToTimeStamp(open_time); 

Więc moje pytanie jest czy są jakieś funkcje mogę użyć jako strToTimeStamp które mogą przekształcić typ zmieniający znak na znacznik czasu bez typu strefy czasowej?

+2

Chcesz 'ALTER COLUMN ... USING'. Zobacz np. Http://stackoverflow.com/search?q=%5Bpostgresql%5D%20ALTER%20COLUMN%20using (near-dup) –

Odpowiedz

5

.. czy są jakieś funkcje mogą używać jako strToTimeStamp które można przekształcić charakter zmienny typ do typu timestamp bez strefy czasowej?

Użyj to_timestamp(), aby zmienić typ danych kolumny w miejscu.

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

Więcej w tych bardzo podobnych pytań:
Alter character field to date
Cast varchar type to date

-3

Nie myśl, że możesz to zrobić, ponieważ jest on ograniczony możliwościami bazy danych. Pomysł robi następujące:

  • Utworzono nową kolumnę z inną nazwą
  • Kopiowanie zawartości kolumn po dane konwersji dla każdego wiersza
  • upuść oryginalny kol
  • Zmień nazwę nowego COL o do oryginalna nazwa kolumny:

Kroki te można umieścić w tym samym pliku migracyjnym i przechowywać na wypadek, gdyby zawierał transakcję.

+0

Oczywiście, że może, możliwości DB pozwalają na to. –

+0

Masz rację, używając kapitalności DB możesz to zrobić, ale chodzi o używanie szyn. Nawet możemy użyć surowego SQL do zmiany kolumny bazy danych w ramach migracji rails, w jakiś sposób nie jest to dobrą praktyką, chyba że wyraźnie zrozumiemy, że projekt koncentruje się na pewnej bazie danych. –

Powiązane problemy