【发布时间】:2017-06-14 10:27:49
【问题描述】:
我在查找 Node.js、knex 和 MySQL(通过 Bookshelf)通用的日期格式时遇到了一些麻烦。
我使用 Knex 架构构建器设置了一个表:
knex.schema.createTableIfNotExists("examples", function (table) {
...
table.dateTime("some_datetime");
})
这会在 MySQL 中创建一个具有 DATETIME 类型的列。
我有一个 Bookshelf 模型来代表这个(这里省略了所有样板文件),我尝试使用内置的 Date.now() 作为值:
exampleModel.save({
some_datetime: Date.now()
})
在 Knex 中打开调试后,我看到查询实际上是在尝试插入一个以毫秒为单位的纪元时间戳(为简洁起见,“...”是我的):
{ ...
bindings: [ 1485644012453, ... ],
sql: 'update `examples` set `some_datetime` = ? where `id` = ?' }
但这是不正确的,因为在这种情况下为MySQL expects you to use FROM_UNIXTIME,因此数据库中的结果日期当然是好的0000-00-00 00:00:00。
我应该在这里做什么才能使这一切保持一致?
- 在创建表时,我应该在架构生成器中使用其他类型吗?
- 或者,除了
Date.now()之外,我还应该使用其他方法来获取日期吗? - 或者,别的什么?
我在这里找不到共同点。我的直觉是在 Knex 中使用 dateTime,在 Node 中使用 Date.now(),在 MySQL 中使用 DATETIME,但这是不正确的。
要明确一点:这个问题不一定专注于哲学上的正确性——目前我实际上无法弄清楚如何在所有数据库中存储日期/时间>。我正在寻找一个工作组合,语义正确只是一个奖励。
【问题讨论】:
-
“在创建表时我应该在模式构建器中使用不同的类型吗?” - 您可以将列类型设置为(更改)@987654322 @。至于
Date.now()的东西;我不能说,因为我对X.js方法一无所知。您正在使用的其他方法/脚本需要作为YYYY-MM-DD 00:00:00传递给DATETIME -
@Fred-ii- Hm,因此您建议完全放弃 Knex 和 MySQL 日期/时间类型,只使用内部存储为整数的纪元时间,并根据需要转换为其他格式,例如用户界面的东西?这似乎在哲学上是错误的,但它也是简单有效且合理的想法。我可能会这样做。谢谢。
-
这取决于你。不同的存储方法(所有)各有利弊。就个人而言,我喜欢使用 MySQL 的内置日期(时间)函数。您最终必须使用
strtotime()或 MySQL 的DATE_FORMAT()来稍后查询。
标签: javascript mysql node.js knex.js