【发布时间】: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