SQLite日期拆分

时间:2016-10-29 19:25:53

标签: sqlite date split

在SQLite中,我有一个' date' “varchar(20)”字段,例如当前读取的日期' 12-AUG-15'。我需要将日期字段拆分为4个单独的字段:' day',' month',' year'和' month_num'。问题是我不知道如何将月份名称转换为数字以及将年份转换为4位数年份。我想过使用大小写和字符串连接函数吗?任何建议如何启动它是非常感谢。

1 个答案:

答案 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日期并让应用程序按照自己的意愿行事。