【问题标题】:Efficient way to convert regular expression date for PostgreSQL为PostgreSQL转换正则表达式日期的有效方法
【发布时间】:2013-09-25 09:17:27
【问题描述】:

我想知道是否有办法在 PostreSQL 中将日期字段上的任何正则表达式转换为适当的日期。

我想把这个“WHERE”语句转换成合适的时间戳比较:

WHERE date::text ~ '2013-0[1-9]-(0[1-9]|1[0-5])'

事实上这真的很慢。我猜是因为 pgsql 时间戳不是为文本正则表达式搜索而制作的。

但是,在 html 字段中编写正则表达式对我来说比使用大量 javascripts 小部件更容易开发。正则表达式也更加灵活。

我接受任何解决方案或建议

谢谢,

【问题讨论】:

    标签: regex postgresql datetime timestamp


    【解决方案1】:

    知道“html 字段”和 JavaScript 小部件是什么意思。这是一个纯 SQL 问题。

    但无论如何,如果我正确理解了正则表达式,这应该可以工作:

    where extract(year from "date") = 2013
      and extract(month from "date") between 1 and 9
      and extract(day from "date") between 1 and 15
    

    虽然只有在某些表达式上创建基于函数的索引才会更快,否则也会进行全表扫描。以下索引可能有助于加快速度(假设条件大大减少了行数)

    create index idx_year 
        on foo (extract(year from "date"), 
                extract(month from "date"), 
                extract(day from "date"));
    

    另一个选项可能是:

    where "date" between DATE '2013-01-01' and DATE '2013-09-15' 
      and extract(day from "date") <= 15
    

    顺便说一句:date 是一个可怕的列名称。首先是因为它也是一个保留字,其次(更重要的是)因为它没有记录该列包含的内容。

    【讨论】:

    • 感谢您的回答。也许我说错了,但用户以正则表达式的方式输入值。我需要一种方法来自动将此正则表达式转换为日期时间格式(即 WHERE 'date' BETWEEN 等)。这就是为什么答案可能不是纯 SQL。
    猜你喜欢
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    • 2010-09-08
    • 2011-08-29
    • 2012-08-21
    • 2016-09-02
    • 1970-01-01
    相关资源
    最近更新 更多