Разница во времени Postgresql на основе интервала

#postgresql

#postgresql

Вопрос:

У меня есть таблица, time_slots , в которой есть столбец start_time . В моей users таблице есть столбец hours_before (int), который представляет собой количество часов start_time до получения уведомления.

Я запускаю задание каждые 5 минут, которое проверяет временные интервалы, которые имеют значение a start_time , которое сейчас равно hours_before . Все мои даты и время хранятся в UTC. Я не могу найти правильное where предложение, чтобы получить соответствующие временные интервалы.

Прямо сейчас я передаю текущее время в UTC в виде строки, а не делаю что-то вроде current_timestamp at time zone 'UTC' .

 (extract(epoch from starts_at) - extract(epoch from (date '2020-11-09 06:20:00'   (users.hours_before * INTERVAL '1 hour')))) = 0
  

Вот тестовый запрос, чтобы увидеть, какие значения находятся внутри a select . В этом примере было бы, (6 * INTERVAL '1 hour') где users.hours_before было бы. Я использую статику 6 во время настройки.

 select
  (extract(epoch from "starts_at") - extract(epoch from date '2020-11-09 06:20:00')) / 3600 as hours,
  (extract(epoch from "starts_at") - extract(epoch from (date '2020-11-09 06:20:00'   (6 * INTERVAL '1 hour')))) as other_interval,
  *
from
  "time_slots"
where
  "starts_at" > '2020-11-09 06:20:00'
order by hours asc;
  

Например, следующий запрос имеет те же hours other_interval значения и, что и приведенный выше запрос, несмотря 2020-11-09 10:00:00 на то, что вместо даты 2020-11-09 06:00:00 . Разве эти столбцы не должны отличаться на 4 часа, поскольку они меняются на 4 часа?

 select
  (extract(epoch from "starts_at") - extract(epoch from date '2020-11-09 10:00:00')) / 3600 as hours,
  (extract(epoch from "starts_at") - extract(epoch from (date '2020-11-09 10:00:00'   (6 * INTERVAL '1 hour')))) as other_interval,
  *
from
  "time_slots"
where
  "starts_at" >= '2020-11-09 06:00:00'
order by hours asc;
  

Комментарии:

1. date '2020-11-09 10:00:00' теряет часть времени, потому что у a date нет времени. Вы хотите timestamp '2020-11-09 10:00:00'

2. Из любопытства: почему бы вам сначала не вычесть значения, а затем получить эпоху? extract(epoch from starts_at - timestamp '2020-11-09 10:00:00' ) `

3. @a_horse_with_no_name timestamp делает свое дело. Чтобы ответить на ваш второй вопрос, потому что я понятия не имею, что я делаю! ха, спасибо за направление.