我正在尝试组合多个日期范围(我的负载大约为最多 500 个,大多数情况下为 10 个),这些日期范围可能会或可能不会重叠到最大的可能连续日期范围中。例如:
数据:
CREATE TABLE test (
id SERIAL PRIMARY KEY NOT NULL,
range DATERANGE
);
INSERT INTO test (range) VALUES
(DATERANGE('2015-01-01', '2015-01-05')),
(DATERANGE('2015-01-01', '2015-01-03')),
(DATERANGE('2015-01-03', '2015-01-06')),
(DATERANGE('2015-01-07', '2015-01-09')),
(DATERANGE('2015-01-08', '2015-01-09')),
(DATERANGE('2015-01-12', NULL)),
(DATERANGE('2015-01-10', '2015-01-12')),
(DATERANGE('2015-01-10', '2015-01-12'));
Run Code Online (Sandbox Code Playgroud)
表看起来像:
id | range
----+-------------------------
1 | [2015-01-01,2015-01-05)
2 | [2015-01-01,2015-01-03)
3 | [2015-01-03,2015-01-06)
4 | [2015-01-07,2015-01-09)
5 | [2015-01-08,2015-01-09)
6 | [2015-01-12,)
7 | [2015-01-10,2015-01-12)
8 | [2015-01-10,2015-01-12)
(8 rows)
Run Code Online (Sandbox Code Playgroud)
预期结果:
combined
--------------------------
[2015-01-01, 2015-01-06)
[2015-01-07, 2015-01-09)
[2015-01-10, ) …
Run Code Online (Sandbox Code Playgroud) 我正在阅读有关物化视图的Postgres 文档,在一个示例中,他们使用以下内容:
SELECT word FROM words ORDER BY word <-> 'caterpiler' LIMIT 10;
Run Code Online (Sandbox Code Playgroud)
我试图在我自己的数据库上运行类似的查询,但出现错误。
[42883] ERROR: operator does not exist: character varying <-> unknown
Run Code Online (Sandbox Code Playgroud)
我(可能)不需要使用运算符,但我只是好奇它的作用。
注意事项:
<->
即使你用引号将它括起来,谷歌也会忽略它。Postgres 在解析时区时表现出一些奇怪的行为,或者我只是不明白它是如何工作的。
从文档:
Run Code Online (Sandbox Code Playgroud)SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'MST'; Result: 2001-02-16 18:38:40
该示例采用 EST (UTC-5) 中指定的时间戳并将其转换为 MST (UTC-7) 中的本地时间。
这似乎意味着“MST”可以与“UTC-7”互换,但行为与您期望的相反。
SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'UTC-7';
Result: 2001-02-17 08:38:40
Run Code Online (Sandbox Code Playgroud)
它没有使用时区“UTC-7”,而是使用时区“UTC+7”,相差 14 小时。
使用 ISO 8601 时区符号也会产生与预期结果相反的结果:
SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE '-7';
Result: 2001-02-17 08:38:40
SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE '-07';
Result: 2001-02-17 08:38:40
SELECT TIMESTAMP …
Run Code Online (Sandbox Code Playgroud)