我想知道是否有办法在 PostreSQL 中将日期字段上的任何正则表达式转换为适当的日期。
我想将此“WHERE”语句转换为适当的时间戳比较:
WHERE date::text ~ '2013-0[1-9]-(0[1-9]|1[0-5])'
事实是这真的很慢。我猜是因为 pgsql 时间戳不是为文本正则表达式搜索而制作的。
但是,在 html 字段中编写正则表达式比使用大量 javascripts 小部件更容易开发。正则表达式也更加灵活。
我采取任何解决方案或建议
谢谢,
我想知道是否有办法在 PostreSQL 中将日期字段上的任何正则表达式转换为适当的日期。
我想将此“WHERE”语句转换为适当的时间戳比较:
WHERE date::text ~ '2013-0[1-9]-(0[1-9]|1[0-5])'
事实是这真的很慢。我猜是因为 pgsql 时间戳不是为文本正则表达式搜索而制作的。
但是,在 html 字段中编写正则表达式比使用大量 javascripts 小部件更容易开发。正则表达式也更加灵活。
我采取任何解决方案或建议
谢谢,
我不知道“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
是一个可怕的列名称。首先是因为它也是一个保留字,其次(也是更重要的)因为它没有记录该列包含的内容。