2012-11-14 18 views
5

में समय क्षेत्र के बिना चरित्र से अलग-अलग समय-समय पर कॉलम प्रकार बदलें, रेल में मैंने ओपन_टाइम नामक स्ट्रिंग कॉलम बनाया लेकिन फिर मुझे एहसास हुआ कि मुझे डेटाटाइम प्रकार का उपयोग करना चाहिए। मैंपोस्टग्रेएसक्यूएल

change_column :polls, :open_time, :datetime 

किया लेकिन यह कहा:

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

मैं सिर्फ स्ट्रिंग स्तंभ ड्रॉप और नए datetime कॉलम जोड़ें, मैं स्ट्रिंग स्तंभ में संग्रहीत डेटा खो देंगे। वैकल्पिक रूप से, PostgreSQL में मैं कॉलम जोड़ें:

ALTER TABLE polls ADD COLUMN published_time timestamp; 

तो मैं जैसे स्ट्रिंग स्तंभ से डेटा प्राप्त करने की कोशिश की:

UPDATE polls SET published_time = strToTimeStamp(open_time); 

तो मेरे सवाल का कोई काम करता है मैं strToTimeStamp के रूप में उपयोग कर सकते हैं कर रहे हैं जो कर सकते हैं समय क्षेत्र प्रकार के बिना चरित्र भिन्न प्रकार को टाइमस्टैम्प में परिवर्तित करें?

+2

आप 'परिवर्तन स्तंभ ... USING' चाहते हैं। उदाहरण के लिए http://stackoverflow.com/search?q=%5Bpostgresql%5D%20ALTER%20COLUMN%20using (नज़दीकी-डुप्लिकेट) –

उत्तर

5

.. वहाँ किसी भी काम करता है मैं strToTimeStamp के रूप में उपयोग कर सकते हैं कि बिना समय क्षेत्र प्रकार टाइमस्टैम्प के चरित्र अलग प्रकार परिवर्तित कर सकते हैं कर रहे हैं?

स्थान पर कॉलम के डेटा प्रकार को बदलने के लिए to_timestamp() का उपयोग करें।

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

अधिक ये बहुत इसी तरह के सवाल के तहत:
Alter character field to date
Cast varchar type to date

-3

ऐसा नहीं लगता कि आप ऐसा कर सकते हैं, क्योंकि यह डेटाबेस की क्षमता से सीमित है। विचार निम्नलिखित कार्य कर रही:

  • एक अलग नाम के साथ एक नया स्तंभ बनाया
  • स्तंभ सामग्री डेटा प्रत्येक पंक्ति
  • ड्रॉप मूल स्तंभ के लिए परिवर्तित करने के बाद से अधिक की प्रतिलिपि
  • नई col करने के लिए का नाम बदलें मूल कॉल नाम

इन चरणों को एक ही माइग्रेशन फ़ाइल में रखा जा सकता है और उन्हें मामले में लेनदेन में रखा जा सकता है।

+0

बेशक वह कर सकता है, डीबी की क्षमताओं की अनुमति है। –

+0

आप सही हैं, डीबी कैपेलिबिटी का उपयोग करके ऐसा कर सकते हैं, लेकिन यह रेल का उपयोग करने के बारे में है। यहां तक ​​कि हम रेल माइग्रेशन के भीतर डेटाबेस कॉलम को बदलने के लिए कच्चे एसक्यूएल का उपयोग भी कर सकते हैं, किसी भी तरह यह एक अच्छा अभ्यास नहीं है जब तक कि हम स्पष्ट रूप से समझें कि परियोजना किसी निश्चित डेटाबेस पर केंद्रित है। –

संबंधित मुद्दे