次のように、タイムスタンプをマイクロ秒の精度で保存しようとしています。
2016-10-18T13:36:38.431555
PostgreSQL を単独でテストしましたが、正常に動作します。
CREATE TABLE test(mytime timestamptz);
INSERT INTO test('2016-10-18T13:36:38.431555');
SELECT * FROM test;
select は正しい精度を返します。
2016-10-18T13:36:38.431555
次に、同じ SQL クエリを使用して、nodejs と pg コネクタでテストしました。
タイムスタンプを文字列として渡すことはできますが、Date オブジェクトを渡したい場合は、マイクロ秒の精度が失われます。Date オブジェクトの最大分解能はミリ秒であるため、これは JavaScript の制限です。これを回避するために、この関数を使用してタイムスタンプを bigint に変換しました。
function convertToUnixTS(timestamp) {
return new Date(timestamp).getTime() * 1000 + parseInt(timestamp.substr(timestamp.length - 3));
}
bigint は postgres に対して透過的であり、選択クエリは正しいタイムスタンプを返します
2016-10-18T13:36:38.431555
Waterline では、postgres アダプターを使用してコレクションを作成し、タイムスタンプを日時として定義しました。
Persistence.prototype.collections.Value = Waterline.Collection.extend({
identity: 'value',
connection: 'default',
attributes: {
mytimestamptz: {
type: 'datetime',
required: true
},
myvalue: {
type: 'float',
required: true
}
}
});
これにより、タイムスタンプが秒単位で保存されます。waterline github でミリ秒をサポートするパッチが提案されている可能性があります (これはテスト済みで、動作しています)。これまで説明してきたように、JavaScript でこれを処理する唯一の方法は、これを bigint に変換することです。現在のモデルにbigintを渡すと例外がスローされるため、このようにモデルを変更しようとしました
mytimestamptz: {
type: 'integer',
size: 64,
required: true
}
と
mytimestamptz: {
type: 'bigint',
required: true
}
しかし、ウォーターライン フレームワークが無効な属性エラーをスローするようになりました。
(node:12964) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 4): [Error (E_VALIDATION) 1 attribute is invalid] Invalid attributes sent to event:
• di_timestamptz
• [object Object]
私が見る文字列として:
1477488110007650
さらに、私はそれをtimestamptzとして持っていることを本当に望んでいます.
出来ますか?
ありがとう