PostgreSQL未正确排序时间戳列

bq3bfh9z  于 2023-03-29  发布在  PostgreSQL
关注(0)|答案(3)|浏览(139)

我在PostgreSQL数据库中有一个表,其中有一个TIMESTAMP WITHOUT TIME ZONE类型的列。我需要按此列对记录进行排序,显然PostgreSQL在这两个方面都遇到了一些麻烦。

...ORDER BY time_column

...ORDER BY time_column DESC

对于具有相同time_column值的3个元素的记录样本,除了其中的毫秒数之外,给予我相同的元素顺序。
似乎在排序时,它没有考虑值中的毫秒。
我确信毫秒实际上存储在数据库中,因为当我获取记录时,我可以在DateTime字段中看到它们。
当我首先加载所有记录,然后在内存中按time_column对它们进行排序时,结果是正确的。
我是否缺少了一些选项来使排序行为正确?

编辑:我显然漏掉了很多,问题不在PostgreSQL,而是在NHibernate剥离了DateTime属性的毫秒数。

sycxhyv7

sycxhyv71#

认为PostgreSQL不能正确排序时间戳是一个愚蠢的想法。运行一个快速测试并保持警惕:

CREATE TEMP TABLE t (x timestamp without time zone);

INSERT INTO t VALUES
 ('2012-03-01 23:34:19.879707')
,('2012-03-01 23:34:19.01386')
,('2012-03-01 23:34:19.738593');

SELECT x FROM t ORDER by x DESC;
SELECT x FROM t ORDER by x;

定量
然后试着找出你的查询中到底发生了什么。如果你不能,发布一个测试用例,你会很快得到帮助。

rm5edbpk

rm5edbpk2#

试着把你的列强制转换为::timestamp,就像这样:

SELECT * FROM TABLE 
ORDER BY time_column::timestamp
e3bfsja2

e3bfsja23#

对于那些有类似问题的人,值得检查列的精度级别
请考虑下表和查询:

CREATE TABLE IF NOT EXISTS table_name (
  id UUID PRIMARY KEY,
  create_date TIMESTAMP(0) WITH TIME ZONE NOT NULL
);

SELECT * FROM table_name ORDER BY create_date DESC

在单元测试中,一组行被一个接一个地插入(在毫秒内),这将给予不一致的结果。将列改为TIMESTAMP(6)而不是0使其具有更高的精度,因此所有行都可以“一次”插入,并且排序仍然有效。

相关问题