【问题标题】:PostgreSQL return exact or closest date to queried datePostgreSQL 返回准确或最接近查询日期的日期
【发布时间】:2014-04-25 13:25:00
【问题描述】:

我有以下 postgresql 语法,它返回值 WHERE session_date 匹配 $date_string

问题是有时 $date_string 在表中不可用,所以我希望返回与 $date_string 最接近的日期

$date_string = '2014-04-25';

SELECT year, session_date FROM calendar_dates WHERE session_date='$date_string'

有什么想法可以做到这一点吗?

【问题讨论】:

标签: sql postgresql


【解决方案1】:

如果您想要最近的日期,请这样做:

SELECT year, session_date
FROM calendar_dates
WHERE session_date < '$date_string'
ORDER BY session_date DESC
LIMIT 1;

最近的日期使用类似的逻辑。

对于任一侧最近的:

SELECT year, session_date
FROM calendar_dates
ORDER BY abs(session_date - date '$date_string') 
LIMIT 1;

【讨论】:

  • 这种竞争条件是否可以证明?
  • @Zanko 。 . .与任何查询一样多。这不是修改数据,因此它取决于正在进行的任何数据修改步骤的事务语义。
  • 如果您想获取特定日期的数据(如果可用,或者如果该日期不可用,则获取之前/之后最接近的日期),您应该将 &lt; 运算符替换为 &lt;=最近的日期或&gt;&gt;= 为最近的日期之后。
【解决方案2】:

使用btree_gist 和 knn

使用此方法,您可以找到最近的带有索引的事件。

CREATE EXTENSION btree_gist;
CREATE TABLE foo ( id serial, ts timestamp );

INSERT INTO foo (ts)
VALUES
  ('2017-06-02 03:09'),
  ('2016-06-02 03:09'),
  ('1900-06-02 03:09'),
  ('1954-06-02 03:09');

CREATE INDEX ON foo USING gist(ts);

SELECT *
FROM foo
ORDER BY '1950-06-02 03:09' <-> ts
LIMIT 1;

第 11 页

在遥远的未来……与knn/btree

【讨论】:

  • 这在速度上与接受的答案相比如何?这个答案需要创建一个索引,而接受的答案不需要,所以我认为这个答案的方法一定有优势。
  • @runeks 快得多。如果被索引,则完全在 PG11+ 中的索引上完成。
  • 您介意将此添加到您的答案中吗?如果您的答案中没有此信息,则没有理由选择它而不是已经接受的答案。另外,你能“更快地”量化吗?例如。是O(log n) 还是公认的答案O(n)
  • @runeks 在表上的 O(N) abs(session_date - date '$date_string') 之前是 O(N) 在表的索引上。它们都是扫描。
  • 非常好。刚刚在 PG 13 上进行了测试,它仍然运行良好。
猜你喜欢
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
  • 2016-12-16
  • 2018-06-04
  • 1970-01-01
  • 2020-01-07
相关资源
最近更新 更多