web-dev-qa-db-ja.com

Knex dateTime()/ MySQL DATETIMEフィールドにNode.js日付を格納する

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は、FROM_UNIXTIME を使用することを想定しているため、データベースの結果の日付は、もちろん、古き良き0000-00-00 00:00:00です。

これをすべて一貫させるためにここで何をすべきですか?

  • テーブルを作成するときにスキーマビルダーで使用する必要がある別の型はありますか?
  • または、Date.now()以外に日付を取得するために使用する必要がある別のものはありますか?
  • または、他の何か?

ここで共通点を見つけるのに苦労しています。私の直感は、KnexではdateTime、NodeではDate.now()、MySQLではDATETIMEを使用すると言っていますが、これは正しくありません。

明確にするために:この質問は、哲学的に正しいものに必ずしも焦点が当てられているわけではありません-現在のところ、allでデータベースに日付/時刻を格納する方法を実際に理解することができません。私は作業の組み合わせを探しています。意味の正確さはボーナスにすぎません。

6
Jason C

JavaScript関数Date.now()は、エポックをミリ秒で返します。 knexusesを使用してクエリを送信するMysqlドライバーは、ISO8061文字列またはDate()オブジェクトをDATETIME列に渡すことを想定しています。

日付オブジェクトは「YYYY-mm-dd HH:ii:ss」文字列に変換されます

https://github.com/mysqljs/mysql

したがって、Date.now()の代わりにnew Date()またはnew Date().toISOString()を使用します

編集:

Mysqlが.toISOString()出力を本当に受け入れることを確認するだけで、ドキュメントからそれについての言及が見つからなかったため 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)

本当にそうです。わーい!すべて良い。

12
Mikael Lepistö

Date.now()の代わりに、組み込みのnow()関数 Knex.js を使用できます。

const knexfile = require('../../knexfile');
const knex = require('knex')(knexfile.development);
const date = knex.fn.now();

代替:

const knexfile = require('../../knexfile');
const knex = require('knex')(knexfile.development);
knex.raw('CURRENT_TIMESTAMP');
5