选择ISO 8601格式的Sqlite日期值

时间:2018-01-27 16:52:39

标签: javascript sqlite knex.js

我正在使用Knex.js从SQLite数据库中选择记录。然后我希望将记录作为JSON返回,作为web api的一部分。从Sqlite中选择日期时,它们的格式为 2018-01-01 00:00:00.000

我希望它们的格式类似于JavaScript的date toJSON()函数: 1975-08-19T23:15:30.000Z

有没有办法让数据库在查询时格式化这样的日期字段?

1 个答案:

答案 0 :(得分:2)

  

所以我希望在连接字符串或Knex等方面有一种方法   告诉Sqlite如何格式化日期。

简答:抱歉,没有。

SQLite将您的ISO8601日期存储为字符串,并且没有内置数据类型可以改变它。

来自Docs link

  

SQLite没有为存储日期留出的存储类   和/或时间。相反,SQLite的内置日期和时间函数   能够将日期和时间存储为TEXT,REAL或INTEGER   值:

     
    

TEXT as ISO8601字符串(" YYYY-MM-DD HH:MM:SS.SSS")。

         

真实的朱利安日数,即公元前4714年11月24日格林威治中午以来的天数。根据公历格里高利历。

         

INTEGER as Unix Time,自1970-01-01 00:00:00 UTC以来的秒数。

  

可能的解决方法#1 - 在数据库中: 您可以在strftime()中使用@sbooth注明的CREATE TRIGGER BEFORE ...来覆盖默认的存储字符串格式。 MS SQL documentation - PIVOT(对不起,我个人并没有这样做过。)

可能的解决方法#2 - 在JS代码中: 使用javascript(就像你提到的那样:.toJSON())以另一种方式预先格式化日期字符串以进行存储。我用的是:

var createDate = (new Date()).toISOString();

...在代码中格式化我的存储日期,代码具有您要查找的格式:'2018-01-28T02:39:53.226Z'

此外,还有一个可能需要注意的问题:当您SELECT ISO8601字符串日期'键入'从SQLite DB通过Knex,它将作为字符串类型返回,而不是Date()类型。

希望这有帮助。加里。