3

我只使用 DATETIME 来跟踪表中重复的每周事件。我只关心时间和它所在的星期几。

我需要能够将设置的 DATETIME 转换为当前或即将到来的未来。

IE 如何将存储为2013-02-22 12:00:00使用当前日期的日期转换为下一次出现的日期?即下周五 12:00:002013-03-01 12:00:00左右,以便我可以按日期订购活动?

或者我可以将 TIME 和星期几分别存储为数字 0-6。

更新:

从欧文我得到了类似的东西:

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

除了我得到的第一个日期是星期一跳过我知道星期天存在的事件之外,这似乎对它们排序。

4

2 回答 2

4

您最好的选择是存储 atimestamptimestamptz( timestamop with time zone)。如果您已经或曾经必须处理多个时区,请确定timestamptz并定义您是要使用当地时间还是 UTC 或其他时间进行操作。此相关答案中的更多详细信息:
在 Rails 和 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;

诀窍是计算interval相应周的开始与给定周之间的时间,timestamp并借助 .将其添加到当前周的开始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

引用有关 EXTRACT() 的手册

dow
星期天(0)到星期六(6)

isodow
星期一(1)到星期日(7)是星期几

在评论中回答问题

我只对相对于当前日期订购它们感兴趣。即如果是星期二,我想先是星期二,最后是星期一。

在“今天”的午夜包装:

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

使用模运算符%根据“今天”移动日期。
使用dow而不是isodow,因为从开始0变得%更简单。

于 2013-02-23T14:07:20.260 回答
1

继续使用日期时间。它很简单,并为您提供了灵活性。您可以使用提取功能来获取一天中的时间和一周中的一天的结果。此页面将为您提供帮助。 http://www.postgresql.org/docs/9.3/static/functions-datetime.html

于 2013-02-23T13:36:28.127 回答