【问题标题】:Different result when querying PostgreSQL through CLI vs through Node.js server通过 CLI 与通过 Node.js 服务器查询 PostgreSQL 时的不同结果
【发布时间】:2020-10-11 09:33:23
【问题描述】:

我有一个简单的 node.js 服务器,它接受请求并查询数据库。当我尝试使用以下函数查询所有余额时


const Pool = require('pg').Pool;
const pool = new Pool({
  user: 'myUsername',
  host: 'localhost',
  database: 'myDatabase',
  password: 'myPassword',
  port: 5432,
});

const getBalances = (request, response) => {
    pool.query('SELECT * FROM balances', (error, results) => {
      if (error) {
        throw error
      }
      response.status(200).json(results.rows)
    })
};

我得到以下结果(忽略余额,相关部分日期)

[{"balance":400,"last_received":"2020-06-20T22:00:00.000Z"},
{"balance":200,"last_received":"2020-06-20T22:00:00.000Z"}, 
{"balance":200,"last_received":"2020-06-20T22:00:00.000Z"}, 
{"balance":400,"last_received":"2020-06-20T22:00:00.000Z"}]

这很奇怪,因为 last_received 应该指向今天的日期。当我使用 PostgreSQL CLI 检查时,我使用与 node.js 代码中相同的查询得到以下结果:

balance | last_received 
--------+--------------
 400    | 2020-06-21
 200    | 2020-06-21
 200    | 2020-06-21
 400    | 2020-06-21

日期不一样,它也不会像我使用 node.js 查询时那样返回时间。我用于创建表的日期数据类型是来自 PostgreSQL 的标准 DATE 数据类型。为什么会这样?我该如何解决?

我尝试过的: 我已经尝试过多次重新查询和重新启动,以确保这不是某种计时错误,但每次都是相同的结果,我已经查询了 show timezone 并在两端得到了相同的结果。

此外,在查询 select now() 时,我在两个视图中都得到了正确且相同的日期,但是当我查询 select CURRENT_DATE 时,它们相差一天,这表明问题出在 CURRENT_DATE 关键字的某个地方。

【问题讨论】:

  • 更新:我注意到这不仅仅是一次性的事情,我通过 CLI 插入的每个新日期都会在前一天通过服务器输出。

标签: javascript sql node.js postgresql node-postgres


【解决方案1】:

node-postgres converts Date types to Datetime in the local timezone,因此它正在转换为您的服务器/节点时区。

所以,要么在获取日期后调整日期,要么调整服务器/节点时区,要么override the type parser

【讨论】:

  • 作为个人意见,我想说我认为库这样做是错误的,应该简单地返回一个 Date 类型。
  • 我绝对同意你的看法——非常感谢你的回答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-22
  • 2013-06-18
  • 2020-01-23
  • 2012-04-20
  • 1970-01-01
相关资源
最近更新 更多