PG :: Error时区,将字符串列更改为时间数据类型

时间:2018-07-20 14:52:46

标签: ruby-on-rails string postgresql rails-migrations

我需要更改列数据类型,当前这些列是字符串,但是我需要更改为“时间”。

迁移文件:

def change
  change_column :enquiries, :start_time, :time
  change_column :enquiries, :end_time, :time
end

错误消息:

  

PG ::错误:错误:列“ start_time”不能自动转换为   键入不带时区的时间提示:您可能需要指定“使用   start_time ::无时区的时间”。

经过一些搜索,我发现了此解决方案,但仍然无法正常工作,但是我收到了新的错误消息。

def change
  change_column :enquiries, :start_time, 'time USING CAST(start_time AS time)'
  change_column :enquiries, :end_time, 'time USING CAST(end_time AS time)'
end
  

PG ::错误:错误:类型时间的无效输入语法:“”

我尝试了 matthewd 解决方案,但仍然无法正常工作。

change_column :enquiries, :start_time, "time USING CAST(NULLIF(start_time, '') AS time)"
  

PG ::错误:错误:类型时间的输入语法无效:“ 09.00”

有什么解决方法的帮助吗?

2 个答案:

答案 0 :(得分:2)

第二个错误是由*_time列之一中具有空白字符串作为值的现有行引起的:正如它所说,这对于time类型而言不是有效输入。

最合理的选择是将其转换为NULL,您可以使用NULLIF SQL函数来完成此操作:

change_column :enquiries, :start_time, "time USING CAST(NULLIF(start_time, '') AS time)"

答案 1 :(得分:0)

基本上,这就是我所做的。有很多start_time和end_time记录,这两列没有验证,因此某些记录的格式不正确(HH:MM)。 但是,需要重构此代码,但这对我有用。

def up
  rename_column :enquiries, :start_time, :start_time_old
  rename_column :enquiries, :end_time, :end_time_old
  add_column :enquiries, :start_time, :time
  add_column :enquiries, :end_time, :time

  Enquiry.reset_column_information
  Enquiry.find_each do |e| 
    unless e.start_time_old.blank?
      if e.start_time_old.include?('.')
        e.update_column(:start_time , e.start_time_old.gsub('.', ':'))
      else
        e.update_column(:start_time , e.start_time_old)
      end
    end
  end

  Enquiry.find_each do |e| 
    unless e.end_time_old.blank?
      if e.end_time_old.include?('.')
        e.update_column(:end_time , e.end_time_old.gsub('.', ':'))
      else
        e.update_column(:end_time , e.end_time_old)
      end
    end
  end

  remove_column :enquiries, :start_time_old
  remove_column :enquiries, :end_time_old
end