SQL抽象出日期并在本周找到下一个

时间:2013-09-12 16:18:58

标签: sql postgresql postgresql-9.2

我有一组记录,通过在开始的第一周使用日期时间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

非常感谢任何帮助!

3 个答案:

答案 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

Code for a calendar table in PostgreSQL

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

答案 2 :(得分: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。