1

我有一组记录,它们使用日期时间存储每周事件......start_at从他们开始的第一周开始。

这不是真正的日期,它存储的是日期(DOW)和时间,但不是我真正要寻找的日期。

我试图弄清楚如何start_at以某种方式转换/抽象日期,以便使用它可以找到未来 24 小时内的所有下一个事件。

START_AT -> 2010-09-12 16:00:00 -> 转换为 2013-09-08 16:00:00

但我不确定如何start_at为即将到来的一周中的一天抽象化。

我想出了如何订购它们,但我不确定如何做我想做的事:

SELECT * FROM events ORDER BY (EXTRACT(dow FROM start_at)::int + 7 - EXTRACT(dow FROM now())::int) % 7,start_at::time

任何帮助将不胜感激!

4

3 回答 3

2

如果您指的是接下来的 24 小时:

SELECT * 
FROM   events
WHERE  start_at BETWEEN now() AND now() + INTERVAL '1 day'

如果您的意思是从午夜开始的下一个 24 小时期间(即明天全天):

SELECT *
FROM   events
WHERE  start_at BETWEEN now()::date + INTERVAL '1 day' AND
                        now()::date + INTERVAL '2 days'
于 2013-09-12T16:33:54.170 回答
1

如果我理解正确,你可能想多了。如果您正在寻找的只是一个重复的日期时间 24 小时,然后您可以执行以下操作:

SELECT * FROM events EXTRACT(dow FROM start_at) = 1

其中 1 是 DOW(星期一)...您从日期中抽象出 DOW

The day of the week as Sunday(0) to Saturday(6)

除非你对时间非常在意,否则你可以在你想要的那一天(约 24 小时)之前搜索 DOW。

于 2013-09-12T17:46:17.200 回答
1

如果我对您的理解正确,您存储重复事件开始的日期,并且您需要知道在接下来的 24 小时内会发生哪些重复事件。

这可能是使用日历表上的联接最容易处理的。下面的 CTE“事件”取代了您的表被调用的任何位置。它存储了我们预计每周都会发生的事件,从 1 月 3 日、1 月 4 日和 1 月 5 日开始。在我写这篇文章的时候,现在是星期四。

with events as (
  select date '2013-01-03' start_at
  union all 
  select date '2013-01-04'
  union all 
  select date '2013-01-05'
), event_days as (
  select events.start_at, c.day_of_week
  from events
  inner join calendar c on c.cal_date = events.start_at
)
select *
from event_days
inner join calendar on event_days.day_of_week = calendar.day_of_week
where cal_date between current_date and current_date + interval '1 days';

start_at    day_of_week  cal_date    year_of_date  month_of_year  day_of_month  day_of_week
2013-01-03  Thu          2013-09-12  2013          9              12            Thu
2013-01-04  Fri          2013-09-13  2013          9              13            Fri

PostgreSQL 中日历表的代码

如果您只存储日期,“接下来的 24 小时”会有点模糊。

于 2013-09-12T16:58:28.920 回答