2

次のように、タイムスタンプをマイクロ秒の精度で保存しようとしています。

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として持っていることを本当に望んでいます.

出来ますか?

ありがとう

4

0 に答える 0