首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在Postgres中的间隔中使用可变期间

在Postgres中的间隔中使用可变期间
EN

Stack Overflow用户
提问于 2011-10-17 16:24:44
回答 4查看 41.7K关注 0票数 70

我有一个维护每月历史数据的关系。此数据将在每个月的最后一天添加到表中。然后,可以调用我正在编写的服务,指定要检索历史数据的月份和月份数。为此,我创建了startDate和endDate变量,然后返回这两个变量之间的数据。我遇到的问题是,startDate是endDate之前的可变月数,我不知道如何在间隔中使用可变期间。

这就是我所拥有的:

代码语言:javascript
运行
AI代码解释
复制
    DECLARE
      endDate   TIMESTAMP := (DATE_TRUNC('MONTH',$2) + INTERVAL '1 MONTH') - INTERVAL '1 DAY';
      startDate TIMESTAMP := endDate - INTERVAL $3 'MONTH';

我知道startDate的线路不正确。如何正确地完成这项工作?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-10-17 18:34:42

使用这一行:

代码语言:javascript
运行
AI代码解释
复制
startDate TIMESTAMP := endDate - ($3 || ' MONTH')::INTERVAL;

注意MONTH前面的空格。基本上:使用like 4 MONTH构造一个字符串,并使用::type将其转换为适当的间隔。

编辑:我找到了另一个解决方案:你可以像这样用interval计算:

代码语言:javascript
运行
AI代码解释
复制
startDate TIMESTAMP := endDate - $3 * INTERVAL '1 MONTH';

这对我来说看起来更好一点。

票数 123
EN

Stack Overflow用户

发布于 2011-10-17 18:35:07

这段代码与您的情况没有直接关系,但它确实说明了如何在区间算术中使用变量。我的表名是“日历”。

代码语言:javascript
运行
AI代码解释
复制
CREATE OR REPLACE FUNCTION test_param(num_months integer)
  RETURNS SETOF calendar AS
$BODY$

    select * from calendar
    where cal_date <= '2008-12-31 00:00:00'
    and cal_date > date '2008-12-31' - ($1 || ' month')::interval;

$BODY$
  LANGUAGE sql VOLATILE
  COST 100
  ROWS 1000;
票数 9
EN

Stack Overflow用户

发布于 2021-02-25 17:45:01

我找到的传递可变时间段给Postgres的最易读的方法类似于A.H.的答案:乘以一个整数,但这可以在没有强制转换的情况下完成。

Python示例(使用sqlalchemy和pandas):

代码语言:javascript
运行
AI代码解释
复制
import pandas as pd
import sqlalchemy as sa

connection = sa.create_engine(connection_string)

df = pd.read_sql(
   sa.text('''
       select * from events
       where
       event_date between now() - (interval '1 day' * :ndays) and now()
       limit 100;
'''),
   connection,
   params={'ndays': 100}
)

天数(Nday)是从Python内部作为整数传递的-因此不太可能出现意外的结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7796657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档