PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

क्नेक्स चुपचाप पोस्टग्रेज टाइमस्टैम्प को टाइमज़ोन के साथ परिवर्तित करता है और गलत समय देता है

शायद चीजें विफल हो रही हैं क्योंकि जब आप निश्चित समयक्षेत्र में डेटाबेस से डेटाटाइम्स से पूछताछ कर रहे हैं और टाइमस्टैम्प के प्रकार को टाइमज़ोन के बिना टाइमस्टैम्प के रूप में प्रभावी ढंग से परिवर्तित कर रहे हैं। उस स्थिति में डेटाबेस knex को जानकारी नहीं भेजेगा कि वह समय किस समय क्षेत्र में लौटा था।

तो knex (या बल्कि pg ड्राइवर जो knex उपयोग कर रहा है) आपके टाइमस्टैम्प को स्थानीय समय के रूप में व्याख्यायित करता है, जो आपके एप्लिकेशन सर्वर के knex के टाइमज़ोन सेटअप पर निर्भर करता है।

आप यूटीसी के रूप में समय प्राप्त कर सकते हैं और पल या लक्सन पुस्तकालयों के साथ जावास्क्रिप्ट पक्ष में टाइमज़ोन रूपांतरण कर सकते हैं (आईएमओ बाद वाला टाइमज़ोन हैंडलिंग के लिए बेहतर है)।

अन्य समाधान पीजी ड्राइवर को बताना होगा कि टाइमज़ोन प्रकारों के साथ टाइमस्टैम्प और टाइमस्टैम्प को JavaScript में परिवर्तित नहीं किया जाना चाहिए Date वस्तुओं।

यह इस तरह किया जा सकता है (https://github.com/brianc/node-pg- प्रकार ):

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);

यह कोड जो सभी टाइमस्टैम्प को स्ट्रिंग्स के रूप में वापस करने के लिए बनाता है उदाहरण के लिए knexfile.js की शुरुआत में जोड़ा जा सकता है . वे लौटाए गए तार ठीक उसी प्रारूप में होंगे जो उन्हें डेटाबेस सर्वर द्वारा ही लौटाए गए थे।

संपादित करें:

मूल पोस्ट में कोड में, जब टाइमस्टैम्प को समय क्षेत्र में परिवर्तित किया जाता है UTC डेटाबेस सर्वर timestamp with time zone में कनवर्ट करता है सामान्य होने के लिए टाइप करें timestamp without time zone इसलिए लौटाए गए मूल्य में टाइमज़ोन जानकारी नहीं है। समय क्षेत्र की जानकारी वापस जोड़ने के लिए आप उदाहरण के लिए +02 को इस तरह से लौटाए गए समय के अंत में जोड़ सकते हैं:

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

जो देता है 2010-01-01 00:00:00+00 ड्राइवर को जिसे पीजी ड्राइवर भी सही से पढ़ सकता है।

यह प्रभावी रूप से वही काम करेगा जो बस SET TIME ZONE 'UTC'; डीबी सर्वर में जब कनेक्शन बनाया जाता है और सीधे टाइमस्टैम्प्ज़ कॉलम लौटाता है:

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

जो 2009-12-31 22:00:00+00 लौटाएगा ।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. आईडी के आधार पर लाखों पंक्तियों को हटाने का सबसे अच्छा तरीका

  2. मैक पर पोस्टग्रेएसक्यूएल के लिए पीडीओ-ड्राइवर स्थापित करना (ग्रहण के लिए ज़ेंड का उपयोग करना)

  3. PostgreSQL के साथ अक्षरांकीय छँटाई

  4. क्या PostgreSql में सरणियों के फ़ील्ड प्रकार के बजाय तालिकाओं का उपयोग करना बेहतर है जब सरणियाँ 50 तत्वों से अधिक न हों?

  5. त्रुटि:संबंध स्थान मौजूद नहीं है हरोकू डीबी आयात