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

Sim*_*mon 5 postgresql

我正在使用 PostgreSQL 9.4,今天我发现了这个Daterange类型。到目前为止,我使用了一个字段startDateTime和另一个字段startEndTime,那么使用该Daterange类型有什么好处呢?

TmT*_*ron 8

对帕特里克回答的一些补充:

  • 包含或排除下限/上限的信息
    • 范围类型明确包含此信息,并且每行可以不同
  • NULL
  • 无法从空中获取日期tsrange
    • select lower(tsrange('2020-12-01', '2020-12-01'));回报NULL
    • 这对我来说是一个难题:我不知道是否可以获得开始/结束日期
  • 更新中
    • 当您有 2 个日期时间字段时,您可以单独更新每个日期时间字段
    • 对于 tsrange,您必须创建一个新值并考虑边界:请参阅更新范围类型的下限/上限
  • 当开始位置低于结束位置时,tsrange 会抛出错误
    select tsrange('2020-12-20', '2020-12-19'); 
    -- [22000] ERROR: range lower bound must be less than or equal to range upper bound
    
    Run Code Online (Sandbox Code Playgroud)
  • 请记住,某些驱动程序/库/工具可能不支持范围类型。例如pg-promise、node-postgres没有内置支持。但是有外部包可以添加支持,例如node-pg-range


Pat*_*ick 6

没有什么是你不能用 a 做的,startDateTime而 anendDateTime是你可以用 a tsrange(或daterangefor dates)做的。然而,有相当多的范围类型运算符使编写查询更加简洁和易于理解。两个范围之间的重叠&&、包含@>和邻接等运算符-|-对于日期和时间范围特别有用。范围类型的一大好处是您可以对它们应用gist索引,这使得搜索速度更快。

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

开始/结束

SELECT *
FROM events
WHERE startDateTime >= '2016-01-01'::timestamp
  AND endDateTime < '2016-01-19'::timestamp;
Run Code Online (Sandbox Code Playgroud)

范围

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