我需要更改列数据类型,当前这些列是字符串,但是我需要更改为“时间”。
迁移文件:
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”
有什么解决方法的帮助吗?
答案 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