在SQLite中,我有一个' date' “varchar(20)”字段,例如当前读取的日期' 12-AUG-15'。我需要将日期字段拆分为4个单独的字段:' day',' month',' year'和' month_num'。问题是我不知道如何将月份名称转换为数字以及将年份转换为4位数年份。我想过使用大小写和字符串连接函数吗?任何建议如何启动它是非常感谢。
答案 0 :(得分: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日期并让应用程序按照自己的意愿行事。