javascript - 通过 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。我认为这与对象具有时间戳的事实有关,时间已超过中午标记?老实说,不知道,任何帮助将不胜感激!
解决方案
您的架构将时间戳列定义为文本类型。您从 nodejs 传入的时间戳文本使用不同的格式,特别是,您的示例显示小时不是零填充的。这意味着您的时间戳字符串(小时)与您期望的方式不同:
select '16' < '4';
?column?
----------
t
(1 row)
解决此问题的最佳方法是将时间戳列的数据类型更改为 type timestamp without time zone
。然后 PostgreSQL 会为你规范化它。您找到了一个合适的过程来将数据类型postgreSQL alter column data type 更改为 timestamp without time zone
推荐阅读
- haproxy - 如何在Haproxy中根据url参数形成一个stick table
- angular - 根据Angular中父组件到子组件的选项传递动态Html元素?
- r - 在ggplot中为具有相同数量的箱绘制平均x和平均y?
- flutter - 如何在 DropdownButton 中更改 Flutter DropdownMenuItem 的宽度/填充?
- c# - 使用 Selenium Webdriver C# 和 Chrome 浏览器弹出窗口中的“允许多次下载”
- python - 从熊猫列中删除重复的字母只存在于彼此,Python
- python - 有没有比这种循环逻辑更好的方法?
- rdkit - 如何使用 rdkit 将微笑转换为指纹?
- java - Java 中毕达哥拉斯树的可视化表示
- localization - TYPO3:如何在TYPO3 9中将新闻的sys_language_uid设置为-1?