2016-10-29 13 views
1

SQLiteでは、'12 -AUG-15 'と読んでいる日付の例として、'日付 'フィールドがvarchar(20)です。私は日付フィールドを4つの別々のフィールドに分割する必要があります: 'day'、 'month'、 'year'、 'month_num'問題は月の名前を数字に変換する方法と、年を4桁の年に変換する方法がわからないことです。私は、大文字と小文字の連結機能を使用することを考えていますか?どのようにそれを開始するためのアドバイスは非常に感謝しています。SQLiteの日付分割

+0

SQLiteは 'varchar'の制限を受け入れません。 ['varchar(20)'は 'text''](https://www.sqlite.org/datatype3.html)です。一般的には、テーブルにサイズ制限を使用しないでください。スペースを節約できません。これは、データスキーマのビジネスロジックをハードコーディングしています。 – Schwern

+0

私はユーザー定義のSQLite関数でこれを行う方法を示すために私の答えを変更しました。 – Schwern

答えて

3

SQLiteは非常に制限されており、dateと文字列関数です。日付関数はISO 8601を理解しています。あなたは長期的にISO 8601に変換し、日付機能を使用する方が良いでしょう。それはより良く分類され、ほとんどすべてがISO 8601フォーマットを理解しています。

SQLiteには簡単な方法はありませんが、変換を行うためのユーザ定義関数を書くことができます。ほとんどのSQLiteドライバでは、使用している言語を問わず使用できます。以下はRubyの例です。

require "sqlite3" 
require "date" 

# Open a database 
db = SQLite3::Database.new "test.db" 

# Create a SQLite function date_to_iso() 
db.create_function("date_to_iso", 1) do |proxy, date| 
    # Convert 12-AUG-15 to 2015-08-12 (ISO 8601 format) 
    iso = Date.strptime(date, "%d-%b-%y"); 

    # This is how you return the result via a FunctionProxy 
    proxy.result = iso.to_s 
end 

# Now you can use date_iso_iso() in SQLite queries in this process. 
db.execute("UPDATE stuff SET date = date_to_iso(date)") 

次に、strftimeを使用して、個々の日付部分を照会することができます。

select 
    strftime("%d", date) as day, 
    strftime("%m", month) as month, 
    strftime("%Y", year) as year 
from whatever; 

残念ながら、SQLiteには月の名前に変換する方法がありません。あなたは大きなCASEステートメントを書くことができます。

select case strftime("%m", month) 
      when 1 then 'JAN' 
      when 2 then 'FEB' 
      ... 
     end 
from whatever; 

また、変換を行う別のユーザー定義関数を追加することもできます。

標準の日付書式を使用しているので、ISO 8601の日付全体を返すだけで、アプリケーションで必要な作業を行うことができます。

関連する問題