我有一个Postgres database和一个nodeJS应用程序(为了完整起见,我使用NestJS框架). 我需要有关时区问题的帮助.

这是我存储博客帖子的表格:

create table if not exists public.posts
(
    id      serial constraint "PK_40808690ebab9150a6558c0f82c" primary key,
    created_at      timestamp default now() not null,
    last_updated_at timestamp default now(),
    title   varchar(256),
    pub_date  timestamp,
    ...
 )

首先,我想查询所有帖子的最新日期:

select max(pub_date)::date from posts;


-> 2023-11-05

然后,我想查询该特定日期的所有博客帖子:

Postgres CLI内,以下查询

select * from daily where pub_date::date = '2023-11-05'::date;

将返回已于2023-11-05发布的所有帖子:

enter image description here

然而,当我从基于NodeJS的后端执行查询时,使用第一个查询的返回值,并将其作为参数传递给第二个查询,它将不会按预期工作.

在后端内部传递第一个查询的结果将返回与前一天不同的日期:

const sql = 'select max(pub_date)::date from posts';
const d = await this.repository.query(sql);
console.log('D', d);

这将收到一个显示预期日期前一天的日期(或正好是预期日期的前1小时23分钟):

D [ { max: 2023-11-04T23:00:00.000Z } ]

当我使用该值执行上面的另一个查询以检索该特定日期的所有帖子时,它不会工作,因为它查询的是2023-11-05=2023-11-04之前一天的帖子

我想这和某种奇怪的时区魔法有关.

使用PostgreSQL CLI(或任何数据库工具,如pgAdmin)将返回正确的值.我的NodeJS后端将返回错误的日期.我使用带有postgreSQL扩展名的TypeORM.

我怎么才能解决这个问题呢?

推荐答案

判断并更正您的客户端set timezone='utc';和/或使用at time zone来明确说明这些日期应该在哪里匹配,然后再向下预测到date.另外,看看您是否可以合并这两个查询,从而省go 往返行程:demo

select current_setting('timezone') as client_timezone,* 
from daily 
where             (pub_date at time zone 'utc')::date
     = (select max(pub_date at time zone 'utc')::date from posts);

Node.js相关问答推荐

MongoServelSelection错误:服务器 Select 在30000 ms后超时

我的位置也移动时左右拖动谷歌 map

运行JEST测试时找不到模块&q;错误

如何使用NodeJS处理来自请求的单个或多个文件?

如何在JavaScript中使用Mongoose将项推送到MongoDB中的重嵌套数组

如何在MongoDB中更新嵌套数组

为什么在导出的函数中调用node-sqlite3中的数据库方法时不起作用?

从MongoDB获取Tree数据

是否可以在MongoDB中比较和匹配引用文档中的字段

mongoose 7.0.3 使用运算符 $and 严格搜索日期

MongoDB - mongoose :如何查询这个? 填充()不起作用.它显示空

我如何保护nodejs中的路由

如何找到特定文档并更新数组中特定键的值?

try 在 Heroku 中部署 PRN 应用程序并获得 404

如何防止 node.js 中的内存泄漏?

Webpack TypeScript module.hot 不存在

带有加密的nodejs中的SALT和HASH密码

对不同对象中的函数使用相同的键时,V8 中的函数调用缓慢

npm install - javascript堆内存不足

大型项目的 NodeJS vs Play 框架