2017-04-01 118 views
0

我有一個csv文件可以在rails上導入到sqlite3中。 csv文件有一個日期列,格式爲MM/DD/YYYY。 sqlite3中的日期被格式化爲DD/MM/YYYY。如何在不更改csv文件的情況下轉換爲相同的格式?Ruby on rails - 在導入csv到rails時更改日期格式

+0

在你的SQLite數據庫,日期存儲在實際的日期列,我希望? –

+0

是的,它存儲在一列 –

+0

顯然,它是一個列,但是那個列的類型是什麼? –

回答

2

首先,你在SQLite中以錯誤的格式存儲日期。從罰款SQLite manual

2.2。日期和時間數據類型

SQLite沒有專門用於存儲日期和/或時間的存儲類。取而代之的是,SQLite的的內置日期和時間函數能夠存儲日期和時間爲TEXTREAL,或INTEGER值:

  • TEXT爲ISO8601字符串(「YYYY-MM-DD HH:MM:SS .SSS「)。
  • [...]

存儲在SQLite的日期將是使用ISO-8601格式(YYYY-MM-DD),這樣就可以使用SQLite的職能與工作一text列的推薦方法他們和他們會比較/排序正確。

的明智的做法是解析傳入日期使用Date.strptime從Ruby的標準庫:

date_for_sqlite = date.iso8601 

date = Date.strptime(date_string_from_csv, '%m/%d/%Y') 

,然後使用Date#iso8601方法將其轉換成一個ISO-8601的日期字符串

然後發送date_for_sqlite到數據庫中。作爲獎勵,任何理智的數據庫都將毫不含糊地理解ISO-8601格式化日期,因此如果切換數據庫,則不必擔心此問題。

如果必須使用非標準DD/MM/YYYY格式然後使用strftime

date_for_sqlite = date.strftime('%d/%m/%Y') 
+0

謝謝。我的csv文件有多行,我使用'namespace:db do task:import_csv =>:environment do CSV.foreach(「sample_landslides.csv」,:headers => true)do | row | Landslide.create!(row.to_hash)'將整個文件導入到rails中。我想刪除當前的日期列,並將轉換日期列日期列導入它。我怎樣才能做到這一點? –

+0

爲什麼不刪除表格,然後用適當的日期格式重新導入它?那裏有新的數據需要保存嗎? –