1

日時を使用して毎週のイベントを保存する一連のレコードがあります...start_atそれらが開始された最初の週から。

これは REAL DATE ではなく、DAY (DOW) と TIME を格納していますが、実際に探している日付ではありません。

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

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)

時間について非常にうるさい場合を除き、目的の日の前に DOW を検索することができます (~24 時間)。

于 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 に答える