PostgreSQL中使用ISO8601时间戳过滤行结果异常问题
问题分析与解决
你遇到的核心问题是过滤字段和你验证的字段不匹配,咱们一步步拆解来看:
为什么这条不符合预期的记录会被返回?
你的SQL语句里,过滤条件用的是last_modified字段:
WHERE orders.last_modified > '2018-03-29T17:44:15.371070+00:00'
但你检查返回结果时,只看了created_at的值——这条记录的created_at确实早于过滤时间,但它的last_modified字段值肯定是满足> '2018-03-29T17:44:15.371070+00:00'条件的,所以数据库才会把它纳入结果集。
两种解决方向
1. 你实际想过滤的是created_at字段
如果你的需求是筛选创建时间晚于指定时间的记录,直接把过滤条件里的字段改成created_at即可,修正后的SQL:
SELECT orders.total_due, orders.created_at FROM orders WHERE orders.created_at > '2018-03-29T17:44:15.371070+00:00' ORDER BY orders.id;
2. 你确实需要过滤last_modified字段
这种情况下,建议在查询结果里同时返回last_modified字段,验证它的实际值是否符合你的预期,这样就能直观明白为什么这条记录被选中:
SELECT orders.total_due, orders.created_at, orders.last_modified FROM orders WHERE orders.last_modified > '2018-03-29T17:44:15.371070+00:00' ORDER BY orders.id;
内容的提问来源于stack exchange,提问作者Lmwangi
相关产品推荐
相关产品推荐

