В SQLite у меня есть поле «дата», которое является varchar (20), в качестве примера датируется в настоящее время «12 -AUG-15». Мне нужно разделить поле даты на 4 отдельных поля: «день», «месяц», «год» и «месяц_нум». Проблема заключается в том, что я не знаю, как конвертировать месячные имена в числа, а также год в год 4 цифры. Я думаю об использовании функций конкатенации case и string? Любой совет, как начать его, хорошо оценили.SQLite date split
ответ
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 и позволить приложению делать то, что он хочет с ней.
SQLite не соблюдает лимиты 'varchar'. ['varchar (20)' is just 'text'] (https://www.sqlite.org/datatype3.html). В общем, не используйте ограничения размера в таблице без серьезной причины. Это не экономит пространство. Это жесткая кодировка бизнес-логики в схеме данных. – Schwern
Я изменил свой ответ, чтобы показать, как вы можете это сделать с помощью определенной пользователем функции SQLite. – Schwern