sql - postgresql工作时间简化查询

标签 sql postgresql simplify cross-join lateral

我需要一些帮助来简化查询(比如避免重复等)

http://www.sqlfiddle.com/#!17/3607d/1/0

我们有 2 个对象:

  • working hours 定义:mon_from, mon_to, tue_from...;如果值为 null 则当天不工作

  • office 用它的 nametimezoneworking_hours_id

    定义

需要简化查找该办公室现在是否在工作的查询,如果办公室没有指定工作时间,则它是 24/7 开放的。

SELECT
name,
   (CURRENT_TIMESTAMP::time AT TIME ZONE timezone)::time,
(workinghours.id IS NULL) OR ((
((CURRENT_TIMESTAMP::time AT TIME ZONE timezone)::time BETWEEN mon_from AND mon_to 
 AND EXTRACT(isodow FROM CURRENT_TIMESTAMP AT TIME ZONE timezone) = 1) OR
((CURRENT_TIMESTAMP::time AT TIME ZONE timezone)::time BETWEEN tue_from AND tue_to 
 AND EXTRACT(isodow FROM CURRENT_TIMESTAMP AT TIME ZONE timezone) = 2) OR
((CURRENT_TIMESTAMP::time AT TIME ZONE timezone)::time BETWEEN wed_from AND wed_to 
 AND EXTRACT(isodow FROM CURRENT_TIMESTAMP AT TIME ZONE timezone) = 3) OR
((CURRENT_TIMESTAMP::time AT TIME ZONE timezone)::time BETWEEN thu_from AND thu_to 
 AND EXTRACT(isodow FROM CURRENT_TIMESTAMP AT TIME ZONE timezone) = 4) OR
((CURRENT_TIMESTAMP::time AT TIME ZONE timezone)::time BETWEEN fri_from AND fri_to 
 AND EXTRACT(isodow FROM CURRENT_TIMESTAMP AT TIME ZONE timezone) = 5) OR
((CURRENT_TIMESTAMP::time AT TIME ZONE timezone)::time BETWEEN sat_from AND sat_to 
 AND EXTRACT(isodow FROM CURRENT_TIMESTAMP AT TIME ZONE timezone) = 6) OR
((CURRENT_TIMESTAMP::time AT TIME ZONE timezone)::time BETWEEN sun_from AND sun_to 
 AND EXTRACT(isodow FROM CURRENT_TIMESTAMP AT TIME ZONE timezone) = 7)
) IS True) AS in_workinghours
FROM office
LEFT JOIN workinghours ON (workinghours.id = office.workinghours_id)

最佳答案

SELECT
  name,
  today_time,
  (workinghours.id IS NULL) OR (today_time BETWEEN today_wtime[1] AND today_wtime[2]) AS in_workinghours
FROM office
LEFT JOIN workinghours ON (workinghours.id = office.workinghours_id)
CROSS JOIN LATERAL (
  SELECT
    (CURRENT_TIMESTAMP::time AT TIME ZONE timezone)::time AS today_time,
    CASE EXTRACT(isodow FROM CURRENT_TIMESTAMP AT TIME ZONE timezone)
      WHEN 1 THEN ARRAY[mon_from, mon_to]
      WHEN 2 THEN ARRAY[tue_from, tue_to]
      WHEN 3 THEN ARRAY[wed_from, wed_to]
      WHEN 4 THEN ARRAY[thu_from, thu_to]
      WHEN 5 THEN ARRAY[fri_from, fri_to]
      WHEN 6 THEN ARRAY[sat_from, sat_to]
      WHEN 7 THEN ARRAY[sun_from, sun_to]
    END AS today_wtime) as wtime 

关于sql - postgresql工作时间简化查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45907621/

相关文章:

postgresql - 如何在 Kibana 中可视化来自 Postgresql 的数据?

java - 我怎样才能实现一个通过传递一个整数来返回一个字符串的方法,而不需要很多 if 语句?

c++ - 可以将 4 位数字成对求和的算法,以便它们的和差尽可能接近

java - 重复属性正则表达式简化

java - 来自不同调度作业的同一列版本

sql - mysql - 用户项目评级,每个用户 1 个评级,可更新 - 表结构?

sql - 尺寸变化缓慢,总是更新

mysql - 从表中获取所有行 - 使用另一个表中的最新行,以及基于最新行的另一个表

postgresql - Postgres全文忽略xml标签

PostgreSQL 触发器停止工作