首页 > 解决方案 > 通过 Node.js 比较 PostgreSQL 中的日期不起作用

问题描述

本质上,我在数据库中有一个表:

每行都有一个 stamp_id、timestamp 和 title 列。所有列都是“文本”类型,未定义排序规则和可空值,所有列的存储都是“扩展”的。在这个特定的行中,

stamp_id: 'scenic',
timestamp: '2021-09-12 16:25:35',
title: 'yeesh'

并且“当前时间戳”是通过这样做创建的:

let currentDate = new Date()
let date = ("0" + currentDate.getDate()).slice(-2);
let month = ("0" + (currentDate.getMonth() + 1)).slice(-2);
let year = currentDate.getFullYear();
let hours = currentDate.getHours();
let minutes = currentDate.getMinutes();
let seconds = currentDate.getSeconds();
let currentTimestamp = year + "-" + month + "-" + date + " " + hours + ":" + minutes + ":" + seconds

//(For reference, currentTimestamp evaluated to '2021-09-12 4:26:16' when I ran this code)

然后,我尝试在对象时间戳未“过期”的数据库中获取所有对象(我认为过期是在 currentTimestamp 之后具有时间戳值。

const client = await pool.connect() //got a pool connection set up
let sqlStatement = 'SELECT * FROM stamp_table WHERE timestamp > ($1)'
let results = await client.query(sqlStatement, [currentTimestamp]);

问题是,没有返回上述特定对象,尽管对象时间戳明显大于 currentTimestamp。我认为这与对象具有时间戳的事实有关,时间已超过中午标记?老实说,不知道,任何帮助将不胜感激!

标签: javascriptsqlnode.jsjsonpostgresql

解决方案


您的架构将时间戳列定义为文本类型。您从 nodejs 传入的时间戳文本使用不同的格式,特别是,您的示例显示小时不是零填充的。这意味着您的时间戳字符串(小时)与您期望的方式不同:

select '16' < '4';
 ?column? 
----------
 t
(1 row)

解决此问题的最佳方法是将时间戳列的数据类型更改为 type timestamp without time zone。然后 PostgreSQL 会为你规范化它。您找到了一个合适的过程来将数据类型postgreSQL alter column data type 更改为 timestamp without time zone


推荐阅读