问题
字符串连接会减慢查询速度:
date(extract(YEAR FROM m.taken)||'-1-1') d1,
date(extract(YEAR FROM m.taken)||'-1-31') d2
这是在代码中作为字符串的一部分实现的,如下所示(其中 p_
变量是整数,由最终用户作为输入提供):
date(extract(YEAR FROM m.taken)||''-'||p_month1||'-'||p_day1||''') d1,
date(extract(YEAR FROM m.taken)||''-'||p_month2||'-'||p_day2||''') d2
这部分查询在包含日期的情况下运行 3.2 秒,不包含日期的情况下运行 1.5 秒,这让我相信还有很大的改进空间。
查询的总运行时间不到 10 秒;我希望将整个查询时间缩短到大约 2 或 3 秒。硬件升级已经发生。 ;-)
版本
PostgreSQL 8.4.4。
问题
创建日期的更好方法是什么(大概没有串联)?
更新
这看起来很有希望:PGTYPESdate_mdyjul
非常感谢!
最佳答案
遗憾的是,我认为没有其他方法可以在没有文本连接的情况下构建日期。
是的,坦率地说,我不喜欢 Postgresql 这里的方法。似乎大多数日期操作必须通过以下方式完成:将日期字段提取为整数,将它们转换为文本,将它们附加到更多文本以创建日期的文本表示,然后告诉 postgres 将该文本解析为日期...这味道对我来说不好,我本能地认为通过解析字符串构建日期应该只从文本输入完成。但是,我认为,postgresql 将数据类型处理与其文本表示联系得太紧密了。因此,例如,如果我想从三个整数值(D,M,Y)构建一个日期,我必须(如果我没记错的话)构建一个字符串并让 PG 解析它。我觉得这样做很不干净......
撇开咆哮不谈,我怀疑这会大大降低你的性能。
关于sql - 使用整数值的日期算术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3019543/