2016-10-29 3 views
1

В SQLite у меня есть поле «дата», которое является varchar (20), в качестве примера датируется в настоящее время «12 -AUG-15». Мне нужно разделить поле даты на 4 отдельных поля: «день», «месяц», «год» и «месяц_нум». Проблема заключается в том, что я не знаю, как конвертировать месячные имена в числа, а также год в год 4 цифры. Я думаю об использовании функций конкатенации case и string? Любой совет, как начать его, хорошо оценили.SQLite date split

+0

SQLite не соблюдает лимиты 'varchar'. ['varchar (20)' is just '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 и позволить приложению делать то, что он хочет с ней.