我有一组记录,通过在开始的第一周使用日期时间start_at
来存储每周事件。
这不是真正的日期,它存储了DAY(DOW)和TIME,但不是我实际需要的日期。
我正在试图弄清楚如何以某种方式转换/摘要start_at
日期,以便我可以找到接下来24小时内的所有下一个事件。
START_AT - > 2010-09-12 16:00:00 - > CONVERT into 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
非常感谢任何帮助!
答案 0 :(得分: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'
答案 1 :(得分: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
如果您只存储日期,那么“接下来的24小时”会有点模糊。
答案 2 :(得分:1)
如果我理解你的话,你可能会过度思考。如果您要找的所有内容都是24小时后的重复发布日期,那么您可以执行以下操作:
SELECT * FROM events EXTRACT(dow FROM start_at) = 1
其中1是DOW(星期一)......你从日期
抽象出DOWThe day of the week as Sunday(0) to Saturday(6)
除非你非常关注时间,否则你可以在你想要的那天之前(~24小时)搜索DOW。