Postgres中的SQL将经常性事件的日期时间转换为未来日期时间[英] SQL in postgres convert datetime for recurring event to future datetime

本文是小编为大家收集整理的关于Postgres中的SQL将经常性事件的日期时间转换为未来日期时间的处理方法,想解了Postgres中的SQL将经常性事件的日期时间转换为未来日期时间的问题怎么解决?Postgres中的SQL将经常性事件的日期时间转换为未来日期时间问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我只使用DateTime来跟踪表中的重复每周事件.我只关心它的时间和一周的一天.

我需要能够将设置的日期时间转换为当前或即将到来的一个.

ie如何使用当前日期将存储为2013-02-22 12:00:00存储的日期转换为下一个发生的日期?即下一个星期五的12:00:00或2013-03-01 12:00:00,以便我可以按日期订购活动?

,或者我可以将一周的时间和一天分别存储为数字0-6.

更新:

来自Erwin我得到了类似的东西:

Event.order("date_trunc('week', now()::timestamp) + (start_at - date_trunc('week', start_at))")

似乎订购了他们,除了我得到的第一个日期是星期一跳过我知道周日存在的事件,这是最后一个.

推荐答案

您的最佳选择是存储timestamp或timestamptz(timestamop with time zone).如果您有或永远不得不处理一个以上的时区,请进行timestamptz,并定义您是否要使用当地时间或UTC或其他方式操作.此相关答案中的更多详细信息:
忽略了铁路和Postgresql

postgresql

演示如何有效地将时间戳(一周和时间的同一天)转扫至当前一周.假设timestamp在这里:

SELECT date_trunc('week', now()::timestamp) + (t - date_trunc('week', t))
FROM (SELECT '2013-02-15 12:00:00'::timestamp AS t) x;

诀窍是在相应周的开始和给定的timestamp之间计算interval,并在 date_trunc() ..

ISO周从星期一开始,将周日推迟.

或,仅在给定的timestamp中添加一个星期:

SELECT t + interval '1 week';

如果您只想ORDER BY,则只需要间隔:

ORDER BY (t - date_trunc('week', t))

如果您想将周日放在第一个(转移日子):

ORDER BY ((t + interval '1d') - date_trunc('week', (t + interval '1d'))

或更简单:

ORDER BY EXTRACT(dow FROM t), t::time

引用

ORDER BY (EXTRACT(dow FROM t)::int + 7 - EXTRACT(dow FROM now())::int) % 7
         ,t::time

使用 modulo operator %根据"今日"的一天.
使用dow而不是isodow,因为以0开始%更简单.

其他推荐答案

继续使用日期时间.它很简单,可以使您灵活.您可以使用提取功能来获得每天的一天中的时间.此页面将为您提供帮助. http://www.postgresql.org.org.org/docs/ddocs/ddocs/9.3/9.3/static/functions -dateTime.html

本文地址:https://www.itbaoku.cn/post/1764038.html