首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从开始日期开始,如何根据星期几计算下一次发生日期?

从开始日期开始,如何根据星期几计算下一次发生日期?
EN

Stack Overflow用户
提问于 2015-01-08 14:31:23
回答 2查看 809关注 0票数 1

我的events表有startdate和enddate列。它还有一个循环布尔列,用于将事件标记为循环。我只需要支持每周的递归。如何为这些重复发生的事件选择下一个合适的日期?

给定以下示例数据和编写本文的时间,我如何才能获得以下结果?

代码语言:javascript
运行
复制
startdate    enddate     nextdate
12/29/14     12/31/15    1/12/15
1/2/15       4/1/15      1/9/15
6/1/14       12/31/14    null
4/1/15       12/31/15    4/1/15

更新:我刚写了这个函数,但现在我想知道有没有更有效的方法……

代码语言:javascript
运行
复制
CREATE OR REPLACE FUNCTION nextdowinrange(startdate timestamp with time zone, enddate timestamp with time zone)
  RETURNS timestamp with time zone AS
$BODY$
    DECLARE
        loopday int;
        nextdate timestamp with time zone;
        BEGIN

        --RANGE PAST
        IF enddate < current_timestamp THEN
            RETURN null;
        --RANGE NOT STARTED
        ELSIF startdate > current_timestamp THEN
            RETURN startdate;
        --SAME DAY OF WEEK
        ELSIF extract(dow from startdate) = extract(dow from current_timestamp) THEN
            RETURN startdate;
        --FIND NEXT
        ELSE
            loopday:= 0;
            LOOP
                IF extract(dow from now() + (loopday || ' days')::interval) = extract(dow from startdate) THEN
                    nextdate:= now() + (loopday || ' days')::interval;
                END IF;
                EXIT WHEN extract(dow from now() + (loopday || ' days')::interval) = extract(dow from startdate);
                loopday:= loopday + 1;

            END LOOP;
            RETURN nextdate;
        END IF;

        END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
EN

Stack Overflow用户

发布于 2015-01-08 17:48:47

下面的查询将为您提供所需的内容。希望这能给你一个基本的想法,你可以根据你的需要进行修改。

我随意添加了一个id列(使连接更容易),并假定startdate和enddate的类型为date

代码语言:javascript
运行
复制
alter table mydates add date_id serial primary key

让我解释一下查询:内部查询生成一系列日期。下一个查询获取该序列中最早的未来日期(对于每个id) -这将不会返回enddate为过去的行的记录。因此,有一个外部查询将那些丢失的记录添加到nextdate为空的位置。

代码语言:javascript
运行
复制
SELECT a.startdate,a.enddate,nextdate FROM -- outer query with left join to get finished ranges
    mydates a
LEFT JOIN 
         -- select the earliest date in the future from the series
         -- This will not contain rows where the enddate is in the past
    (SELECT date_id,min(theweeks)::date AS nextdate FROM 
        (SELECT date_id, generate_series -- Get a series of the week dates
           (
           startdate
           ,enddate
           , '1 week'::interval) as theweeks 
         FROM mydates
         ) AS daterange
    WHERE now() < theweeks
    GROUP BY date_id) AS nextdates
ON nextdates.date_id = a.date_id
ORDER BY a.date_id
票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27834235

复制
相关文章

相似问题

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