使用Postgresql Daterange类型而不是两个Date字段有什么好处?

时间:2016-01-20 00:51:36

标签: postgresql

我正在使用PostgreSQL 9.4,今天我发现了isTrainer类型。到目前为止,我使用了字段 startDateTime 和其他字段 startEndTime ,那么使用Daterange类型会有什么好处?

2 个答案:

答案 0 :(得分:4)

Patricks answer 的一些补充:

  • 是否包含或排除下限/上限的信息
    • 范围类型明确包含此信息,并且每行可以不同
  • NULL
  • 无法从空的 tsrange 获取日期
    • select lower(tsrange('2020-12-01', '2020-12-01')); 返回 NULL
    • 这对我来说是个难题:我不知道是否可以获得开始/结束日期
  • 正在更新
  • tsrange 当开始低于结束时会抛出错误
    select tsrange('2020-12-20', '2020-12-19'); 
    -- [22000] ERROR: range lower bound must be less than or equal to range upper bound
    
  • 请记住,某些驱动程序/库/工具可能不支持范围类型。例如pg-promisenode-postgres 没有内置支持。但是有外部软件包可以添加支持,例如node-pg-range

答案 1 :(得分:3)

使用startDateTimeendDateTime tsrange可以对daterangedate做任何事情。 }} S)。然而,有相当多的operators on range types使得编写查询更加简洁和易懂。两个范围之间的重叠&&,包含@>和邻接-|-等运算符对日期和时间范围特别有用。范围类型的一大好处是你对它们应用了gist index,这使搜索速度更快。

例如,查找在特定时间范围内发生event的所有行:

开始/结束

SELECT *
FROM events
WHERE startDateTime >= '2016-01-01'::timestamp
  AND endDateTime < '2016-01-19'::timestamp;

<强>范围

SELECT *
FROM events
WHERE startEndRange <@ tsrange('2016-01-01'::timestamp, '2016-01-19'::timestamp);