knex.js迁移中的时间戳字段

时间:2017-09-11 09:54:52

标签: javascript node.js sqlite datetime knex.js

我目前正在使用knex为我的数据库(sqlite3)编写迁移。我正在制作"用户"表格,我希望有两个时间戳字段,created_atupdated_at。我希望它们是notNullable并在向表中插入行时默认添加。我可以使用像table.timestamp("created_at).notNullable().defaultTo(knex.fn.now())这样的东西但是在SQLiteStudio中它显示为格式化的时间戳YYYY-MM-DD HH:MM:SS在UTC时区(所以不是我的时区)。所以我有两个问题:

  1. 如何将此日期设置为我的时区?
  2. 是否可以以这种方式在sqlite中设置datetime字段,当我从SELECT语句中获取它时,它将作为Unix时间戳(整数)返回并仍然在SQLiteStudio中显示为格式化日期?
  3. 这是我的迁移代码:

    exports.up = function(knex, Promise) {
    return Promise.all([
        knex.schema.createTable('users', function(table) {
            table.increments("_id").primary().notNullable();
            table.text("login").unique().notNullable();
            table.text("given_name").notNullable();
            table.text("family_name").notNullable();
            table.timestamp("created_at").notNullable().defaultTo(knex.fn.now());
            table.timestamp("updated_at").notNullable().defaultTo(knex.fn.now());
            table.boolean("is_active").notNullable().defaultTo(true);
        }),
    ]);
    };
    

1 个答案:

答案 0 :(得分:0)

寻找here应该提供一些线索。

  

日期和时间函数

     

SQLite支持五个日期和时间函数,如下所示:

date(timestring, modifier, modifier, ...) 
time(timestring, modifier, modifier, ...) 
datetime(timestring, modifier, modifier, ...)
julianday(timestring, modifier, modifier, ...) 
strftime(format, timestring, modifier, modifier, ...)

我认为我们的想法是始终将时间存储为UTC,然后在您想要显示值时使用strftime()转换为本地时间。

使用带有localtime的{​​{1}}标记的示例:

  

计算给定unix时间戳1092941466的日期和时间,和   补偿你当地的时区。

datetime

对于人类可读的文字,您需要SELECT datetime(1092941466, 'unixepoch', 'localtime'); 。它有点粗糙,但它的工作原理。我希望knex可以提供这些类型的查询,这是我从未听说过的!