在Knex dateTime()/ MySQL DATETIME字段中存储Node.js日期

Jas*_*n C 6 javascript mysql node.js knex.js

我在查找Node.js,knex和MySQL(通过Bookshelf)常见的日期格式时遇到了一些麻烦.

我使用Knex架构构建器设置了一个表:

knex.schema.createTableIfNotExists("examples", function (table) {
    ...
    table.dateTime("some_datetime");
})
Run Code Online (Sandbox Code Playgroud)

这将DATETIME在MySQL中创建一个类型的列.

我有一个代表这个的Bookshelf模型(在这里省略了所有的样板文件),我尝试使用内置Date.now()的值:

exampleModel.save({
    some_datetime: Date.now()
})
Run Code Online (Sandbox Code Playgroud)

在Knex中打开调试后,我看到查询实际上是在尝试插入一个毫秒的纪元时间戳("......"为简洁起见):

{ ...
  bindings: [ 1485644012453, ... ],
  sql: 'update `examples` set `some_datetime` = ? where `id` = ?' }
Run Code Online (Sandbox Code Playgroud)

但这是不正确的,因为MySQL希望你FROM_UNIXTIME在这种情况下使用,因此数据库中的结果日期当然是好的0000-00-00 00:00:00.

我应该在这做什么才能使这一切保持一致?

  • 在创建表时,我应该在模式构建器中使用不同的类型吗?
  • 或者,我是否应该使用不同的东西来获取日期Date.now()
  • 或者是其他东西?

我在这里找不到共同点.我的直觉说dateTime在使用Knex,Date.now()在Node中,DATETIME在MySQL中,但这是不正确的.

只是要清楚:这个问题不一定集中在什么是哲学正确的-此刻,我居然无法弄清楚如何存储日期/数据库倍一切.我正在寻找一个有效的组合,语义正确只会是一个奖励.

Mik*_*stö 11

Javascript函数Date.now()以毫秒为单位返回纪元.knex用于发送查询的Mysql驱动程序需要将ISO8061字符串或Date()对象传递给DATETIME列.

日期对象转换为'YYYY-mm-dd HH:ii:ss'字符串

https://github.com/mysqljs/mysql

所以不要Date.now()使用new Date()new Date().toISOString()

编辑:

只是检查mysql真的接受.toISOString()输出,因为我无法从docs https://dev.mysql.com/doc/refman/5.7/en/date-and-time-type-overview.html找到它的提及

MariaDB [(none)]> select CAST('2017-01-30T16:49:19.278Z' AS DATETIME);
+----------------------------------------------+
| CAST('2017-01-30T16:49:19.278Z' AS DATETIME) |
+----------------------------------------------+
| 2017-01-30 16:49:19                          |
+----------------------------------------------+
1 row in set, 1 warning (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

看起来确实如此.好极了!都好.


Ben*_*uer 11

相反的Date.now(),你可以使用内置now()的功能Knex.js

const knexfile = require('../../knexfile');
const knex = require('knex')(knexfile.development);
const date = knex.fn.now();
Run Code Online (Sandbox Code Playgroud)

选择:

const knexfile = require('../../knexfile');
const knex = require('knex')(knexfile.development);
knex.raw('CURRENT_TIMESTAMP');
Run Code Online (Sandbox Code Playgroud)