转换PostgreSQL的正则表达式日期的有效方法

时间:2013-09-25 09:17:27

标签: regex postgresql datetime timestamp

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

我想将此“WHERE”语句转换为正确的时间戳比较:

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

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

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

我采取任何解决方案或建议

谢谢,

1 个答案:

答案 0 :(得分: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是一个可怕的名字。首先是因为它也是一个保留字,其次(更重要)因为它没有记录列包含的内容。