【问题标题】:Compare postgres Timestamp with JavaScript Date Object比较 postgres 时间戳和 JavaScript 日期对象
【发布时间】:2021-01-20 14:15:37
【问题描述】:

我正在使用带有 pg 的 Node.js 来查询 Postgres 数据库。我正在尝试执行以下查询:

SELECT COUNT(*) FROM table_name WHERE date_time_added::date = some_date;

some_date 是我从 Node.js 传递的日期。

大多数时候我对此没有任何问题,因为两个日期/时间字符串的格式相同。但是,引入时区时会出现问题。由于我位于英国,我们在一年中的某些时间使用英国夏令时 (GMT+1)。

当我将 date_time_added 从它的存储类型(带有时区的时间戳)转换为日期时,时间默认为午夜。这样做的问题是,在 BST 期间,时间戳会提前一天,并且时间设置为 23:00 而不是 00:00,如下所示:

{ date_time_added: 2020-09-28T23:00:00.000Z }

如果 JavaScript 具有相同的行为,这将不是问题,但是如果我尝试以下操作:

const date1 = new Date(2020, 8, 29, 10, 47, 54);
console.log(date1.toString());
date1.setHours(0);
date1.setMinutes(0);
date1.setSeconds(0);
date1.setMilliseconds(0);
console.log(date1.toString());

产生以下输出:

"Tue Sep 29 2020 10:47:54 GMT+0100 (British Summer Time)"
"Tue Sep 29 2020 00:00:00 GMT+0100 (British Summer Time)"

时间设置为午夜,而不是前一天的 23:00。这对我来说是个问题,因为这意味着日期不匹配,因此数据库查询中不会返回该行。

有谁知道我怎样才能在两个日期(JS 和 Postgres)中获得相同的行为?能够以与 Postgres 在我投射日期时相同的方式使用默认时间初始化一个新的日期对象会很好,但是我不确定这是否可能。

【问题讨论】:

  • 我认为您在滥用 Date 对象。您将时间部分(小时、分钟、秒)显式设置为 0 - 为什么您期望得到非零结果?如果你所有的时间戳都是由 Node 生成的——那么你应该在 JavaScript 中比较它们。但是,如果某些时间戳来自 Postgres 中的 now() 函数 - 那么最好比较 SQL 查询中的时间戳。

标签: javascript postgresql date


【解决方案1】:

张贴以防其他人将来遇到此问题。

这个问题是因为在 Postgres 中将时间戳转换为日期会丢失时区,因此它会从午夜减去一个小时(因为将时区转换为日期时时间设置为午夜),导致它变为 23 :00 日期前一天(因为 BST 是 +1 小时)。

我决定使用纪元时间,因为这样可以更轻松地满足我的需要。

我通过使用以下查询解决了这个问题:

SELECT COUNT(*) FROM table_name WHERE extract(epoch from date_trunc('day', date_time_added)) = some_date_epoch;

这会保留时区并返回所选时间戳日期的纪元时间(午夜)。 'some_date_epoch' 是 JavaScript 日期对象的纪元时间,使用 Date.getTime() 方法获得。这是我要在数据库中搜索的日期的纪元时间。

例如,这就是我如何在 JavaScript 中获取当前日期的纪元时间,然后在数据库查询中使用:

let currentDate = new Date();
currentDate.setHours(0);
currentDate.setMinutes(0);
currentDate.setSeconds(0);
currentDate.setMilliseconds(0);
let currentDateEpoch = (currentDate.getTime() / 1000); //Convert to seconds to match Postgres

currentDateEpoch 然后将用于查询数据库。

【讨论】:

  • 我没有信心,但我相信像这样转换到 epoch 的较大数据集可能会导致性能问题
  • 目前看来表现还不错。一旦我开始使用更多数据,我将监控情况,如果性能不佳,我将不得不更改它。感谢您的提醒
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-02
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多