sql >> Database >  >> RDS >> PostgreSQL

Knex converteert stilletjes Postgres-tijdstempels met tijdzone en retourneert onjuiste tijd

Waarschijnlijk mislukken dingen omdat wanneer u datetimes opvraagt ​​​​uit de database in een bepaalde tijdzone en het type tijdstempel effectief converteert naar een tijdstempel zonder tijdzone. In dat geval zal de database geen informatie naar knex sturen over in welke tijdzone de geretourneerde tijd was.

Dus knex (of liever het pg-stuurprogramma dat knex gebruikt) interpreteert uw tijdstempel als lokale tijd, wat afhangt van de tijdzone-instelling van uw applicatieserver waarop knex draait.

Je zou tijd kunnen ophalen net als UTC en tijdzoneconversie doen in JavaScript-kant met moment- of luxon-bibliotheken (IMO laatste is beter voor het afhandelen van tijdzones).

Een andere oplossing zou zijn om pg driver te vertellen dat tijdstempel en tijdstempel met tijdzonetypes niet geconverteerd mogen worden naar JavaScript Date voorwerpen.

Het kan als volgt worden gedaan (https://github.com/brianc/node-pg- soorten ):

const types = require('pg').types;
const TIMESTAMPTZ_OID = 1184;
const TIMESTAMP_OID = 1114;
types.setTypeParser(TIMESTAMPTZ_OID, val => val);
types.setTypeParser(TIMESTAMP_OID, val => val);

Deze code die ervoor zorgt dat alle tijdstempels worden geretourneerd als tekenreeksen, kan worden toegevoegd aan bijvoorbeeld het begin van knexfile.js . Die geretourneerde strings hebben exact hetzelfde formaat als dat ze zijn geretourneerd door de databaseserver zelf.

EDIT:

In code in het originele bericht, wanneer tijdstempel wordt geconverteerd naar tijdzone UTC databaseserver converteert timestamp with time zone type normaal timestamp without time zone dus de geretourneerde waarde heeft geen tijdzone-informatie. Om tijdzone-informatie weer toe te voegen, kunt u bijvoorbeeld +02 toevoegen aan het einde van de geretourneerde tijdstempel als volgt:

select ('2010-01-01T00:00:00.000Z'::timestamptz AT TIME ZONE 'UTC')::text || '+00';

Wat resulteert in 2010-01-01 00:00:00+00 naar het stuurprogramma dat ook door het pg-stuurprogramma correct kan worden gelezen.

Dit zal in feite hetzelfde doen als het instellen van SET TIME ZONE 'UTC'; in db-server wanneer verbinding is gemaakt en gewoon de tijdstempelkolom direct retourneren:

SET TIME ZONE 'UTC';
select '2010-01-01T00:00:00.000+02:00'::timestamptz;

Die zal terugkeren 2009-12-31 22:00:00+00 .




  1. Datums tussen twee datums ophalen

  2. Vergelijk DATETIME en DATE en negeer het tijdsgedeelte

  3. Hoe maak je een reeks in SQL Server 2008

  4. Probleem bij het invoegen van python-script in mysql-database met innondb-engine