День недели и время, когда оговорка - PullRequest
0 голосов
/ 09 июня 2018

У меня есть следующий запрос SQL, который отлично работает.В зависимости от часового пояса строки, он получает строку в течение таймфрейма

SELECT *, (now() AT TIME ZONE account.timezone)::time AS local_time 
FROM contact INNER JOIN account ON account.id = contact.account_id 
WHERE (now() AT TIME ZONE account.timezone)::time BETWEEN '17:30'::time AND '22:00'::time

Но я хотел бы иметь другое время, будь то выходные или будний день.В выходные я хочу 15:30 вместо 17: 30

Как бы это сделать с Postgresql?

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

Я бы сделал это с помощью простой логической логики:

SELECT *, (now() AT TIME ZONE a.timezone)::time AS local_time 
FROM contact c INNER JOIN
     account a
     ON a.id = c.account_id 
WHERE (EXTRACT(DOW FROM now() AT TIME ZONE a.timezone) IN (6, 0) AND
       (now() AT TIME ZONE a.timezone)::time BETWEEN '15:30'::time AND '22:00'::time
      ) OR
      (EXTRACT(DOW FROM now() AT TIME ZONE a.timezone) NOT IN (6, 0) AND
       (now() AT TIME ZONE a.timezone)::time BETWEEN '17:30'::time AND '22:00'::time
      );

Из-за повторения я мог бы склоняться сформулировать это следующим образом:

SELECT *, nowtz::time AS local_time 
FROM (VALUES (now() AT TIME ZONE a.timezone)) v(nowtz) CROSS JOIN
     contact c INNER JOIN
     account a
     ON a.id = c.account_id 
WHERE (EXTRACT(DOW FROM nowtz) IN (6, 0) AND
       (nowtz::time BETWEEN '15:30'::time AND '22:00'::time)
      ) OR
      (EXTRACT(DOW FROM nowtz) NOT IN (6, 0) AND
       (nowtz::time BETWEEN '17:30'::time AND '22:00'::time)
      )

Логика WHERE можетбыть упрощенным до:

WHERE (EXTRACT(DOW FROM nowtz) IN (6, 0) AND nowtz::time >= '15:30'::time OR
       nowtz::time >= '17:30'::time 
      ) AND
      nowtz::time <= '22:00'::time
0 голосов
/ 09 июня 2018

Используйте EXTRACT(DOW FROM ...), чтобы получить день недели.Затем используйте CASE ... END перенастройку 15:30, когда это суббота или воскресенье, и 17:30 в противном случае.

SELECT *,
       (now() AT TIME ZONE account.timezone)::time AS local_time 
       FROM contact
            INNER JOIN account
                       ON account.id = contact.account_id 
       WHERE (now() AT TIME ZONE account.timezone)::time BETWEEN CASE
                                                                   WHEN EXTRACT(DOW FROM now() AT TIME ZONE account.timezone) IN (6, 0)
                                                                     THEN '15:30'::time
                                                                   ELSE
                                                                     '17:30'::time
                                                                 END
                                                                 AND '22:00'::time;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...