Ruby on rails Rails/POSTGRES ISDATE函数

Ruby on rails Rails/POSTGRES ISDATE函数,ruby-on-rails,ruby,postgresql,date,Ruby On Rails,Ruby,Postgresql,Date,我想将所有非日期格式的字符串更改为datenil,然后更改列类型。我曾计划使用以下工具: class SetSubmitDateForAllMyTables < ActiveRecord::Migration def self.up MyTable.connection.execute("UPDATE my_table SET submit_date = NULL WHERE NOT ISDATE(submit_date)") MyTable.connection.ex

我想将所有非日期格式的字符串更改为datenil,然后更改列类型。我曾计划使用以下工具:

class SetSubmitDateForAllMyTables < ActiveRecord::Migration
  def self.up
    MyTable.connection.execute("UPDATE my_table SET submit_date = NULL WHERE NOT ISDATE(submit_date)")
    MyTable.connection.execute("UPDATE my_table SET submit_date=created_at WHERE submit_date IS NULL")
    change_column :my_table, :submit_date, :date
  end

  def self.down

  end
end

Postgresql可以强制字符串到目前为止,但它将在无效字符串上出错:

dev_db=> select '1/2/2015'::date;
    date
------------
 2015-01-02

dev_db=> select 'asdf'::date;
ERROR:  invalid input syntax for type date: "asdf"
LINE 1: select 'asdf'::date;
               ^

为了解决这个问题,您可以创建一个Postgresql函数来检查字符串是否为有效日期,但实际上,在迁移过程中处理每条记录的转换要容易得多

这是一次性的改变吗?数据是什么样子的?@MikeSherrill'CatRecall'这应该是一个迁移,可以在任何尚未进行此迁移的环境中运行,所以希望是一次性的。这个字段是一个字符串,所以它可以包含任何字母数字。当你谈论日期转换时,任何字母数字这个短语都包含了大量的错误。它真的能包含像“wibble”、“01/02/03”、“1963年4月4日”、“Jug 134,2015”这样的值吗?@MikeSherrill“CatRecall”不太可能,但确实可以。通常,它将是一个空白字符串,或者是一个格式类似于2014年2月1日或2014年1月2日的日期。我准备好了一个误差范围。如果这只是一次性的,我会编写一个PL/pgSQL函数,该函数试图将字符串转换为日期,捕获“can't cast”异常,并在异常上返回NULL。do ALTER TABLE ALTER列带有USING子句,用于使用该函数进行转换。然后在完成后删除该函数。或者进行一系列的正则表达式争论,以标准化您的数据格式,并将其他所有内容设置为NULL。
dev_db=> select '1/2/2015'::date;
    date
------------
 2015-01-02

dev_db=> select 'asdf'::date;
ERROR:  invalid input syntax for type date: "asdf"
LINE 1: select 'asdf'::date;
               ^